Анализ ответа REST API - PullRequest
       12

Анализ ответа REST API

0 голосов
/ 09 октября 2018

Я новичок в Голанге.Я писал программу для анализа ответа json API: https://httpbin.org/get. Я использовал следующий код для анализа ответа:

package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "os"
)

type Headers struct {
    Close  string `json:"Connection"`
    Accept string `json:"Accept"`
}

type apiResponse struct {
    Header Headers `json:"headers"`
    URL    string  `json:"url"`
}

func main() {
    apiRoot := "https://httpbin.org/get"
    req, err := http.NewRequest("GET", apiRoot, nil)
    if err != nil {
        fmt.Println("Couldn't prepare request")
        os.Exit(1)
    }
    response, err := http.DefaultClient.Do(req)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    defer response.Body.Close()
    var responseStruct apiResponse
    err = json.NewDecoder(response.Body).Decode(&responseStruct)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    fmt.Printf("%v\n", responseStruct)
}

Когда я запускаю этот код, вывод:

$ go run parse.go
{{close } https://httpbin.org/get}

Из вывода, как мы видим, клавиша «Принять» в ответе json не декодируется.Почему это так?Как я могу разобрать эту строку из тела ответа?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

apiResponse не экспортируется - вам нужно изменить его на что-то вроде APIResponse.Вы можете обнаружить, что вставка JSON, который вы хотите декодировать в https://mholt.github.io/json-to-go/, сделает весь код, который вам нужен!

type AutoGenerated struct {
    Args struct {
    } `json:"args"`
    Headers struct {
        Accept                  string `json:"Accept"`
        AcceptEncoding          string `json:"Accept-Encoding"`
        AcceptLanguage          string `json:"Accept-Language"`
        Connection              string `json:"Connection"`
        Dnt                     string `json:"Dnt"`
        Host                    string `json:"Host"`
        UpgradeInsecureRequests string `json:"Upgrade-Insecure-Requests"`
        UserAgent               string `json:"User-Agent"`
    } `json:"headers"`
    Origin string `json:"origin"`
    URL    string `json:"url"`
}
0 голосов
/ 09 октября 2018

Ваш код работает хорошо, но здесь я думаю, что ваш ключ Accept не возвращается из API, поэтому он не показывает значение Accept.Чтобы проверить пару key, value вашей структуры, используйте следующий метод print.

fmt.Printf("%+v\n", responseStruct)

Чтобы преодолеть эту ситуацию, вам необходимо отправить Accept с запросом в headerперед запросом API как:

req.Header.Set("Accept", "value")
response, err := hc.Do(req)
if err != nil {
    fmt.Println(err)
    os.Exit(1)
}

Тогда вы получите значение Accept в decoded struct как:

{Header:{Accept:value Close:close} URL:https://httpbin.org/get}
...