所以這個讓我發(fā)瘋。我什至不確定標題是否 100% 正確,因為我在將問題縮小到一個特定部分時遇到了一些麻煩。我有兩個通過 REST 相互通信的應用程序。一個接受來自另一個應用程序的 HTTP GET 請求,并用一些 JSON 回答。對于 HTTP 路由器,我使用 Gorilla/mux 順便說一句。到現(xiàn)在為止還挺好。我的第一個應用程序(我們稱之為FooReader)正在FooWriter通過 HTTP GET調用我的第二個應用程序(我們稱之為):req, err := http.NewRequest("GET", url, nil)req.Header.Set("uuid", "my uuid")req.Header.Set("api_token", "my token")req.Header.Set("Content-Type", "application/json")client := &http.Client{}resp, err := client.Do(req)if err != nil { ...}defer resp.Body.Close()這工作得很好。正如你所看到的,我在標題中發(fā)送了一些額外的東西,這就是為什么我沒有使用http.Get(). (有一個更好的方法嗎?)現(xiàn)在FooWriter接收該請求并對其進行處理:...var successJSON = "{\"foo\":\"bar\"}"w.Header().Set("Content-Type", "application/json; charset=UTF-8")w.Write([]byte(successJSON))w.WriteHeader(200)if err := json.NewEncoder(w).Encode(err); err != nil { ...}回到FooReader我現(xiàn)在收到的響應FooWriter并閱讀它(為了清楚起見,我再次添加了 Do() 調用):resp, err := client.Do(req)if err != nil { ...}defer resp.Body.Close()fmt.Println("response Code:", resp.StatusCode)body, err := ioutil.ReadAll(io.LimitReader(resp.Body, 1048576))if err != nil { ...}fmt.Println("response Body:", string(body))現(xiàn)在到了奇怪的部分:當我像在最后一行那樣打印響應正文時null,在原始 JSON 字符串中添加了一個附加內容:response Code: 200response Body: {"foo":"bar"}null我的猜測是nil在 JSON 解碼之前有一些扔在那里,但我找不到它。此外,我猜測問題必須出在FooReader側面,因為我FooWriter在應用程序的其他部分使用了完全相同的代碼,效果很好。我錯過了什么嗎?任何幫助深表感謝!
1 回答

開心每一天1111
TA貢獻1836條經驗 獲得超13個贊
if err := json.NewEncoder(w).Encode(err)
當 err 為 nil 時打印 null。傳遞響應以進行編碼并使錯誤成為其中的一部分,因此僅打印一個 json 結構。
- 1 回答
- 0 關注
- 126 瀏覽
添加回答
舉報
0/150
提交
取消