我有一個奇怪的情況。我想application/json; charset=utf-8從 http 處理程式回傳內容型別。
func handleTest() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Accept") != "application/json" {
w.WriteHeader(http.StatusNotAcceptable)
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json; charset=utf-8")
json.NewEncoder(w).Encode(map[string]string{"foo": "bar"})
}
}
當我在單元測驗中檢查它時,它是正確的。這個測驗不會失敗。
func TestTestHandler(t *testing.T) {
request, _ := http.NewRequest(http.MethodGet, "/test", nil)
request.Header.Set("Accept", "application/json")
response := httptest.NewRecorder()
handleTest().ServeHTTP(response, request)
contentType := response.Header().Get("Content-Type")
if contentType != "application/json; charset=utf-8" {
t.Errorf("Expected Content-Type to be application/json; charset=utf-8, got %s", contentType)
return
}
}
但是當我嘗試使用 curl(和其他客戶端)時,它顯示為text/plain; charset=utf-8.
$ curl -H 'Accept: application/json' localhost:8080/test -v
* Trying 127.0.0.1:8080...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /test HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.68.0
> Accept: application/json
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Tue, 28 Dec 2021 13:02:27 GMT
< Content-Length: 14
< Content-Type: text/plain; charset=utf-8
<
{"foo":"bar"}
* Connection #0 to host localhost left intact
我用 curl、失眠和蟒蛇試過這個。在所有 3 種情況下,內容型別都為text/plain; charset=utf-8.
是什么導致了這個問題,我該如何解決?
uj5u.com熱心網友回復:
從http 包檔案:
WriteHeader 發送帶有提供的狀態代碼的 HTTP 回應標頭。
和
在呼叫 WriteHeader(或 Write)之后更改標題映射無效,除非修改后的標題是尾部。
因此,在標頭已發送到客戶端之后,您正在設定“Content-Type”標頭。雖然模擬這可能有效,因為可以在WriteHeader呼叫后修改存盤標頭的緩沖區。但是當實際使用 TCP 連接時,你不能這樣做。
所以只需移動你的,w.WriteHeader(http.StatusOK)這樣它就會發生在w.Header().Set(...)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/398116.html
