23

この質問を読みましたが、私の質問には答えませんでした。

私にとって、ヘッダーとパラメーターはどちらも辞書であり、ヘッダーが[String : String]パラメーターであるという違いがある[String : AnyObject]?ため、パラメーターも文字列である場合は、ヘッダー内でそれらを送信できます(「x-」プレフィックスを使用して、それらが標準ヘッダーではないことを示します) ) これは一般的ですが、良い方法ではありません。

  • あれは正しいですか?
  • と の間に他に違いはheadersありparametersますか?
  • を使用して、他にどのような非 String 型を送信しparametersますか?

アラモファイアRequest

public func request(
        method: Method,
        _ URLString: URLStringConvertible,
          parameters: [String: AnyObject]? = nil,
          encoding: ParameterEncoding = .URL,
          headers: [String: String]? = nil)
        -> Request
    {
        return Manager.sharedInstance.request(
            method,
            URLString,
            parameters: parameters,
            encoding: encoding,
            headers: headers
        )
    }

["x-ios-version" : UIDevice.currentDevice().systemVersion]例として、ヘッダーを介してバージョンを渡したりビルドしたりする人を見てきました

4

2 に答える 2

24

受け入れられた答えは非常に実用的です。必ずご覧ください。ただし、ここで詳しく説明する基本的な違いが 2 つあります。

1 - HTTP リクエストが作成されたときにそれぞれが配置される場所を理解する

URL は HTTP メッセージとは異なります。HTTP メッセージは、RequestまたはResponseのいずれかになります。この回答では、リクエストに焦点を当てます。

HTTP リクエストは、に url、http メソッド、http ヘッダーで構成されます (他にもチャンクがありますが、最も重要なものについて言及しているだけです)。

Request       = Request-Line              ; Section 5.1
                *(( general-header        ; Section 4.5
                  | request-header         ; Section 5.3
                  | entity-header ) CRLF)  ; Section 7.1
                CRLF
                [ message-body ]          ; Section 4.3

リクエスト行は次のとおりです。

Request-Line   = Method SP Request-URI SP HTTP-Version CRLF

CLRF新しい行のようなものです。

詳細については、こちらこちらをご覧ください。うまくいくまで、リンク間を行ったり来たりする必要があるかもしれません。本当に深く掘り下げたい場合は、このRFCを参照してください。

したがって、基本的にリクエストは次のようなものです。

POST /cgi-bin/process.cgi?tag=networking&order=newest HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Content-Type: text/xml; charset=utf-8
Content-Length: 60
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

first=Zara&last=Ali

クエリ パラメータはURL 内にあります。HTTP ヘッダーは URL の一部ではありません。それらは HTTP メッセージの一部です。上記の例では、クエリ パラメータtag=networking&order=newestで、ヘッダーは次のとおりです。

User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Content-Type: text/xml; charset=utf-8
Content-Length: 60
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

したがって、ネットワーク リクエストを行うときは、http プロトコルを使用してフォーマットされた文字列を作成しています。その文字列はTCP接続を介して送信されます

2 - どちらも物事を伝えるために使用できますが、一方が他方よりも好まれる理由と場所を理解する

チャットでのロブとの議論から:

基準は、それがリクエストまたはクライアントに関する情報である場合、ヘッダーが適切であるということです。
ただし、それがリクエスト自体の内容である場合 (たとえば、サーバーからリクエストしているもの、返されるアイテムを特定する詳細、Web サーバーに保存される詳細など)、それはパラメーターです。

パラメータ
製品の画像をリクエストしているとしましょう。製品 ID は 1 つのパラメーターである場合があります。画像サイズ (サムネイルとフルサイズ) は、別のパラメーターである可能性があります。製品 ID と要求された画像サイズは、要求のコンテンツの一部として提供される「一部の詳細」(またはパラメーター) の例です。

ヘッダー
しかし、リクエストのようなものは JSON であるか、リクエストのコンテンツx-www-form-urlencodedではなく、リクエストに関するメタデータです(特に、Web サービスがリクエストの本文を解析する方法を知る必要があるため)。というわけでヘッダーです。

多くの場合、アプリがさまざまなリクエストを行う場合、そのヘッダーには多くの共通点があります。ただし、パラメータはコンテンツ ベースであるため、より多様化する必要があります。

于 2016-11-08T19:17:23.300 に答える
22

違いのリストは次のとおりです。

  1. それらはさまざまな目的のために設計されています。ヘッダーはメタ情報を運び、パラメーターは実際のデータを運びます。

  2. HTTP サーバーは、パラメーター名/値を自動的にアンエスケープ/デコードします。これは、ヘッダーの名前/値には適用されません。

  3. ヘッダーの名前/値は、クライアント側で手動でエスケープ/エンコードし、サーバー側で手動でエスケープ解除/デコードする必要があります。Base64 エンコーディングまたはパーセント エスケープがよく使用されます。

  4. パラメーターは (URL で) エンドユーザーに表示されますが、ヘッダーはエンドユーザーには表示されません。

于 2016-11-08T17:35:19.067 に答える