1

データを取得するために HTTP get 要求を送信する必要がある HTTP クライアントを作成しています。ブースト asio ライブラリを使用しているため、標準の URL エンコーディング ライブラリを使用する方法がありません。

これが私がnetcatとMozillaから得たものです(典型的なgetリクエスト)

localhost:2000/questions/10838702/how-to-encode or-d   ecode-url-in-objective-c

リクエスト URL を取得

F:\pydev>nc -l -p 2000
GET /questions/10838702/how-to-encode%20or-d%20%20%20ecode-url-in-objective-c HTTP/1.1
Host: localhost:2000
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive

Mozilla は URL のクエリ部分のみをエンコードすることがわかりました。

この URL エンコーディング Web ページを試してみました http://meyerweb.com/eric/tools/dencoder/

そして、次のURLをエンコードします

localhost:2000/questions/10838702/how-to-encode or-d   ecode-url-in-objective-c

localhost%3A2000%2Fquestions%2F10838702%2Fhow-to-encode%20or-d%20%20%20ecode-url-in-objective-c

URLエンコーディングを使用する場所を誰かに提案できますか?

4

1 に答える 1

2

原則として、英数字 (A-Z0-9) 以外の任意の文字で- _ .~URL に何らかの特別な目的があるか、許可されていません。

予約文字は; / ? : @& =space. これらの文字を特別な意味以外の方法で使用する場合は、URL エンコードする必要があります。安全のために、多くのエンコーダーは、明示的に安全ではないものすべてをエンコードするだけです。

たとえば、ファイル名に疑問符が含まれているとします (ファイルfile?nameに名前を付けて、URL を作成する必要があります。問題は、http://somehost.com/file?name希望どおりに解釈されないことです。URL は一致します。/fileあなたの Web スペースで、 の検索語をname持っています。URL を取得するには、ファイル名をエンコードする必要がありますhttp://somehost.com/file%3Fname

この仕様では、サーバーによってエンコードされないことを期待して、英数字を含む任意の文字を URL エンコードできます。予約文字が本来の目的で使用されている場合は、エンコードされていないことを確認する必要があります。例: 区切り文字として使用されているため、コロンまたはスラッシュをエンコードしたくありませんhttp://somehost.com

URL エンコーディングの最も頻繁な使用は、フォーム データの準備です。この場合、通常は一連のキーと値のペアから始めます。次のような形式のエンコードされたデータを作成します (疑似コード)。

  1. キーと値をエンコードする
  2. キーと値を「=」で連結して用語を取得します。例: encodedKey=encodedValue.
  3. 用語のリストができるまで、1 と 2 を繰り返します
  4. すべての項をアンパサンドで結合します。例えば:encKey1=encVal1&encKey2=encVal2

デコードは逆のプロセスです。

  1. 「&」記号に沿ってフォーム データを分割し、用語の配列を取得します
  2. 「=」文字で各用語を分割して、エンコードされたキーと値を取得します
  3. キーと値をデコードする

簡単に聞こえますが、多くの人が間違っていることに驚くかもしれません。

ここでは、細かい部分をいくつか省略しました。いつものように、関連する仕様は最後の言葉です。この場合、RFC 1738 .

于 2013-04-25T21:47:40.293 に答える