HTTP-запрос Golang возвращает 200 ответов, но пустое тело - PullRequest
0 голосов
/ 12 октября 2018

Я делаю пост-запрос и получаю ответ 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 голосов
/ 18 октября 2018

Я локально подтвердил, что ваш код, как показано, должен работать.

Вот код, который я использовал:

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.

Если вы возвращаете тело с помощью почтальона, вы должны отправлять другой запрос в почтальоне, чем в го.Иногда бывает трудно понять, в чем разница, поскольку и го, и почтальон могут иногда добавлять заголовки за кулисы, которые вы не видите.Опять же, что-то вроде wireshark может помочь здесь.

Или, если у вас есть доступ к серверу, вы можете добавить туда логи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...