web-dev-qa-db-ja.com

REST URIのスペースに何を使用しますか?

私は何を使うべきですか:

  • / findby/name/{first} _ {last}
  • / findby/name/{first}-{last}
  • / findby/name/{first}; {last}
  • / findby/name/first/{first}/last/{last}

等.

URIは1つの名前を持つPersonリソースを表しますが、それぞれを識別するために最初と最後を論理的に分離する必要があります。私は次のことができるので、最後の例が好きです。

  • / findby/name/first/{first}
  • / findby/name/last/{last}
  • / findby/name/first/{first}/last/{last}
16
Droo

いつでもスペースを受け入れることができます:-)(クエリ文字列は%20としてエスケープされます)

しかし、私の好みはダッシュ(-)を使用することです... URLの方が見栄えがします。基本的にクエリを実行できる必要がない限り、最後の例の方が適切です。

15
Joel Martinez

スペースに+を使用してみませんか?

私は途方に暮れています:ダッシュ、マイナス、アンダースコア、%20 ...なぜ+を使用しないのですか?これは、スペースが通常クエリパラメータでエンコードされる方法です。はい、%20も使用できますが、なぜか見苦しいです。

やる

/personNamed/Joe+Blow
16
Nas Banov

検索用:

/people/search?first={first}&last={last}
/people/search?first=george&last=washington

リソースパスの場合:

/people/{id}-{first}-{last}
/people/35-george-washington

標準構成でRuby on Rails v3を使用している場合、その方法は次のとおりです。

# set up the /people/{param} piece
# config/routes.rb
My::Application.routes.draw do
  resources :people
end

# set up that {param} should be {id}-{first}-{last}
# app/models/person.rb
class Person < ActiveRecord::Base
  def to_param
    "#{id}-#{to_slug(first_name)}-#{to_slug(last_name)}"
  end
end

あなたの提案に注意してください、/findby/name/first/{first}/last/{last}、安らかではありません。リソースに名前を付けたり、簡潔に名前を付けたりすることはありません。

2
yfeldblum

「_」はスペースに最もよく似た文字であり、URLを読みやすくするため、「_」を使用するのが好きです。

ただし、指定したURLは実際にはRESTfulではないようです。 URLはリソースを表す必要がありますが、あなたの場合は検索クエリを表します。だから私はこのようなことをします:

_/people/{first}_{last}
/people/{first}_{last}_(2)  - in case there are duplicate names
_

この場合、各ユーザーレコードのスラッグ(_{first}_{last}_、{first}_{last}_(2))を保存する必要があります。 IDを付加する別のオプション。これにより、スラッグを気にする必要がなくなります。

_/people/{id}-{first}_{last}
_

また、検索には、RESTfulではないURLを使用できます。

_/people/search?last={last}&first={first}
_

これらは、特定の人のページの上のURLに、検索結果のリストを表示します。

検索URLをRESTfulにすることには何の役にも立たないと思います。ユーザーは、検索結果ページではなく、特定の人のページへのリンクを共有したいと思うでしょう。検索エンジンに関しては、複数のURLに同じコンテンツを含めることは避けてください。また、robots.txtで検索結果ページのインデックスを作成することも拒否する必要があります。

2
Leventix

最も洗練された選択は、常に、そしてまず第一に、2つの制約を考慮する必要があります。

  1. 開発者や実装されているデバイスがURLエンコードの処理に関してどれほど熟練しているかわからないので、私は常に自分自身を 安全な文字の表 に制限しようとします。 (お願い)URLでの安全でない文字の使用をやめてください
  2. また、クライアントがAPIを使用することを検討したいと思います。構造全体をクライアント側のプログラミング言語で簡単に表現してアクセスできるようにすることはできますか? this要件はどのような特殊文字を残しますか?つまり$はjavascript変数名で問題ないため、解析結果から直接アクセスできますが、PHPクライアントはさらに複雑な(そして潜在的により混乱する)表記を使用する必要があります$userResult->{'$mostVisited'}->someProperty...それはあなた自身の足でのショットです!したがって、これら2つ(および他のいくつかのプログラミング環境)では、アンダースコアが唯一の有効なオプションのようです。

それ以外の場合、私は@yfeldblumの応答にほぼ同意します-検索エンドポイントと実際の一意のリソースルックアップを区別します。私にはもっとREST)と感じますが、もっと重要なのは、2つがAPIサーバー上で大幅なコスト差を持っていることです-これ区別しやすくする方法、つまり、検索エンドポイントに高いコストやレート制限を課すことができます。

実用的である 「RESTafarian」とは対照的に、言及されたアプローチ/people/35-george-washingtonは基本的にIDのみに応答する可能性があります(そして、imhoである必要があります)。 dummies-link、参照を/people/35_george_washingtonとしてリストします。他のアイデアは/people/35/#GeorgeWashington(RFCのトンを壊す)または/people/35_GeorgeWashingtonである可能性があります-APIは気にしません。

1
Philzen