簡體   English   中英

HTTP 參數和 HTTP 標頭有什么區別?

[英]What is the difference between HTTP parameters and HTTP headers?

我讀了這個問題,但它沒有回答我的問題。

對我來說,標題和參數都是字典,不同之處在於標題是[String : String]而參數是[String : AnyObject]? 因此,如果您的參數也是字符串,那么您可以在標題中發送它們(同時使用“x-”前綴表示它們不是標准標題),這是一種常見但不是好的做法。

  • 那是對的嗎?
  • headersparameters之間還有其他區別嗎?
  • 您將使用parameters發送什么樣的其他非字符串類型?

Alamofire 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]或通過標頭構建版本

公認的答案非常實用。 確保你看到它。 但是我將深入討論兩個基本差異:

標頭和參數放置在 HTTP 請求中的位置

URL 不同於 HTTP 消息。 HTTP 消息可以是RequestResponse 在這個答案中,我將專注於請求。

一個 HTTP 請求主要由 url、http-method、http-headers 組成(其中還有其他塊,但我只是提到我們最關心的那些)

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 - 為什么以及在哪里優先於另一個

來自與 Rob 在聊天中的討論:

標准是,如果它是關於請求或關於客戶端的信息,那么標頭是合適的。
但如果它是請求本身的內容(例如,您從服務器請求的內容、標識要返回的項目的一些詳細信息、要保存在 Web 服務器上的一些詳細信息等),那么它就是一個參數,例如:

范圍
假設您正在請求產品的圖像。 產品id可以是一個參數。 圖像大小(縮略圖與全尺寸)可能是另一個參數。 產品 ID 和請求的圖像大小是作為請求內容的一部分提供的“某些細節”(或參數)的示例。

標題
但是請求是 JSON 或x-www-form-urlencoded之類的東西不是請求的內容,而是關於請求的元數據(特別是因為 Web 服務需要知道如何解析請求的正文)。 這就是為什么它是一個標題。

如果您的應用程序發出各種請求,最有可能的是,它的標頭會有很多共同點。 但是,由於它們是基於內容的,因此參數應該更加多樣化。


使用URLComponents構建

class UnsplashRequester {
    
    static let session = URLSession.shared
    static let host = "api.unsplash.com"
    static let photosPath = "/photos"
    static let accessKey = "My_access_key"
    
    static func imageRequester(pageValue: String, completion: @escaping (Data?) -> Void) {
        var components = URLComponents()
        components.scheme = "https"
        components.host = host
        components.path = photosPath

        // A: Adding a Query Parameter to a URL
        components.queryItems = [URLQueryItem(name: "page", value: pageValue)]
        let headers: [String: String] = ["Authorization": "Client-ID \(accessKey)"]
        
        var request = URLRequest(url: components.url!)
        for header in headers {
            
            // B: Adding a Header to a URL
            request.addValue(header.value, forHTTPHeaderField: header.key)
        }
        
        let task = session.dataTask(with: request) { data, _, error in
        }
    }
}

以下是差異列表:

  1. 它們是為不同的目的而設計的。 標頭攜帶元信息,參數攜帶實際數據。

  2. HTTP 服務器將自動取消轉義/解碼參數名稱/值。 這不適用於標頭名稱/值。

  3. 標頭名稱/值需要在客戶端手動轉義/編碼,並在服務器端手動取消轉義/解碼。 經常使用 Base64 編碼或百分比轉義。

  4. 最終用戶可以看到參數(在 URL 中),但標題對最終用戶是隱藏的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM