Golang HTTP请求返回200响应,但主体为空

时间:2018-10-12 07:09:46

标签: api http go

我正在发布请求,并且收到200 OK响应。我也收到标题。但是,身体一直空着回来。 应该有一个身体,当我在邮递员那里运行它时,身体会出现。我在这里想念什么?

func AddHealthCheck(baseURL string, payload HealthCheck, platform string, hostname string) (string, error) {
    url := fmt.Sprintf(baseURL+"add-healthcheck/%s/%s", platform, hostname)

    //convert go struct to json
    jsonPayload, err := json.Marshal(payload)
    if err != nil {
        log.Error("[ADD HEALTH CHECK] Could not convert go struct to json : ", err)
        return "", err
    }

    // Create client & set timeout
    client := &http.Client{}
    client.Timeout = time.Second * 15

    // Create request
    req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonPayload))
    if err != nil {
        log.Error("[ADD HEALTH CHECK] Could not create request : ", err)
        return "", err
    }
    req.Header.Set("Content-Type", "application/json")

    // Fetch Request
    resp, err := client.Do(req)
    if err != nil {
        log.Error("[ADD HEALTH CHECK] Could not fetch request : ", err)
        return "", err
    }
    defer resp.Body.Close()

    // Read Response Body
    respBody, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Error("[HEALTH CHECK] Could not read response body : ", err)
        return "", err
    }

    fmt.Println("response Status : ", resp.Status)
    fmt.Println("response Headers : ", resp.Header)
    fmt.Println("response Body : ", string(respBody))

    return string(respBody), nil
}

1 个答案:

答案 0 :(得分:2)

我已经在本地确认您的代码(如图所示)可以正常工作。

这是我使用的代码:

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
    "time"
)

func main() {
    http.HandleFunc("/", handler)
    go func(){
        http.ListenAndServe(":8080", nil)
    }()

    AddHealthCheck()
}

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hi there")
}

func panicError(err error) {
    if err != nil {
        panic(err)
    }
}

func AddHealthCheck() (string, error) {

    //convert go struct to json
    payload := "bob"
    jsonPayload, err := json.Marshal(payload)
    panicError(err)

    // Create client & set timeout
    client := &http.Client{}
    client.Timeout = time.Second * 15

    // Create request
    req, err := http.NewRequest("POST", "http://localhost:8080", bytes.NewBuffer(jsonPayload))
    panicError(err)
    req.Header.Set("Content-Type", "application/json")

    // Fetch Request
    resp, err := client.Do(req)
    panicError(err)
    defer resp.Body.Close()

    // Read Response Body
    respBody, err := ioutil.ReadAll(resp.Body)
    panicError(err)

    fmt.Println("response Status : ", resp.Status)
    fmt.Println("response Headers : ", resp.Header)
    fmt.Println("response Body : ", string(respBody))

    return string(respBody), nil
}

上面的代码只是代码的简化版本,它输出响应的主体。 (请注意,我在这里提供了一个服务器来接收发布请求并返回响应)

服务器根本没有向您发送尸体。您可以使用Wireshark之​​类的方法进行确认。

如果您要使用邮递员送回尸体,则必须在邮递员中发送与在go中发送的请求不同的请求。有时很难看到有什么区别,因为go和postman有时都可以在看不见的场景后面添加标题。同样,wireshark之​​类的东西可以在这里提供帮助。

或者,如果您有权访问服务器,则可以在其中添加日志。