Heim >Backend-Entwicklung >Golang >Mein API-Antworttext scheint abgeschnitten zu sein?

Mein API-Antworttext scheint abgeschnitten zu sein?

WBOY
WBOYnach vorne
2024-02-05 21:57:08608Durchsuche

我的 API 响应正文似乎被截断了?

Frageninhalt

Ich steige zum ersten Mal in GO ein und die API, die ich zum Abrufen von Aktienkursen verwende, akzeptiert mehrere Ticker (denken Sie an Aktien-IDs; NVDA => Nvidia), um meine begrenzten API-Aufrufe zu reduzieren. Beim Versuch, mehrere Codes abzurufen, scheint der Textkörper jedoch abgeschnitten zu sein:

{
    "meta ": {
        "requested ": 2,
        "returned ": 2
    },
    "data ": [
        {
            "ticker ": "MSFT ",
            "name ": "Microsoft Corporation ",
            "exchange_short ": null,
            "exchange_long ": null,
            "mic_code ": "IEXG ",
            "currency ": "USD ",
            "price ": 374.72,
            "day_high ": 376.92,
            "day_low ": 373.54,
            "day_open ": 374.94,
            "52_week_high ": 349.84,
            "52_week_low ": 213.43,
            "market_cap ": null,
            "previous_close_price ": 374.58,
            "previous_close_price_time ": "2023-12-22T15:59:56.000000 ",
            "day_change ": 0.04,
            "volume ": 165558,
            "is_extended_hours_price ": false,
            "last_trade_time ": "2023-12-26T16:00:00.000000 "
        },
        {
            "ticker ": ""

Exakter Aufruf der Stock-API direkt in Postman-Retouren:

{
    "meta": {
        "requested": 2,
        "returned": 2
    },
    "data": [
        {
            "ticker": "MSFT",
            "name": "Microsoft Corporation",
            "exchange_short": null,
            "exchange_long": null,
            "mic_code": "IEXG",
            "currency": "USD",
            "price": 374.72,
            "day_high": 376.92,
            "day_low": 373.54,
            "day_open": 374.94,
            "52_week_high": 349.84,
            "52_week_low": 213.43,
            "market_cap": null,
            "previous_close_price": 374.58,
            "previous_close_price_time": "2023-12-22T15:59:56.000000",
            "day_change": 0.04,
            "volume": 165558,
            "is_extended_hours_price": false,
            "last_trade_time": "2023-12-26T16:00:00.000000"
        },
        {
            "ticker": "PLTR",
            "name": "Palantir Technologies Inc",
            "exchange_short": null,
            "exchange_long": null,
            "mic_code": "IEXG",
            "currency": "USD",
            "price": 17.68,
            "day_high": 17.75,
            "day_low": 17.34,
            "day_open": 17.45,
            "52_week_high": 17.16,
            "52_week_low": 5.92,
            "market_cap": null,
            "previous_close_price": 17.42,
            "previous_close_price_time": "2023-12-22T15:59:56.000000",
            "day_change": 1.47,
            "volume": 236201,
            "is_extended_hours_price": false,
            "last_trade_time": "2023-12-26T15:59:58.000000"
        }
    ]
}

Ich glaube, ich habe etwas falsch gemacht (ich hatte GO vor gestern noch nie berührt) Der relevante Code lautet wie folgt:

func getStockPriceData(ticker string) []Stock {
    baseURL, _ := url.Parse("https://api.stockdata.org")

    baseURL.Path += "v1/data/quote"

    params := url.Values{}
    params.Add("symbols", ticker)
    params.Add("api_token", apiToken.ApiToken)

    baseURL.RawQuery = params.Encode()

    req, _ := http.NewRequest("GET", baseURL.String(), nil)

    res, _ := http.DefaultClient.Do(req)

    defer res.Body.Close()

    body, err := io.ReadAll(res.Body)
    if err != nil {
        panic(err.Error())
    }

    apiResponseData := ApiResponseStockData{}

    //json.NewDecoder(res.Body).Decode(&apiResponseData)
    err2 := json.Unmarshal(body, &apiResponseData)
    if err2 != nil {
        fmt.Println("whoops:", err2)
    }

    stocks := []Stock{}
    for _, data := range apiResponseData.ResponseStockData {
        stock := Stock{}
        stock.Name = data.Name
        stock.Ticker = data.Ticker
        stock.Price = data.Price
        stock.DayHigh = data.DayHigh
        stock.DayLow = data.DayLow
        stock.DayOpen = data.DayOpen
        stock.PreviousClosePrice = data.PreviousClosePrice
        stock.DayChange = data.DayChange
        stocks = append(stocks, stock)
    }
    return stocks
}

Kontextstruktur:

type Stock struct {
    Name               string  `json:"name"`
    Ticker             string  `json:"ticker"`
    Price              float64 `json:"price"`
    DayHigh            float64 `json:"day_high"`
    DayLow             float64 `json:"day_low"`
    DayOpen            float64 `json:"day_open"`
    DayChange          float64 `json:"day_change"`
    PreviousClosePrice float64 `json:"previous_close_price"`
}

type ApiResponseStockData struct {
    ResponseStockData []ResponseData `json:"data"`
}

type ResponseData struct {
    Name                 string    `json:"name"`
    Ticker               string    `json:"ticker"`
    ExchangeShort        bool      `json:"exchange_short"`
    ExchangeLong         bool      `json:"exchange_long"`
    MicCode              string    `json:"mic_code"`
    Currency             string    `json:"currency"`
    Price                float64   `json:"price"`
    DayHigh              float64   `json:"day_high"`
    DayLow               float64   `json:"day_low"`
    DayOpen              float64   `json:"day_open"`
    DayChange            float64   `json:"day_change"`
    YearHigh             float64   `json:"52_week_high"`
    YearLow              float64   `json:"52_week_low"`
    MarketCap            float64   `json:"market_cap"`
    PreviousClosePrice   float64   `json:"previous_close_price"`
    PreviousCloseTime    time.Time `json:"previous_close_time"`
    Volume               float64   `json:"volume"`
    IsExtendedHoursPrice bool      `json:"is_extended_hours_price"`
    LastTradeTime        time.Time `json:"last_trade_time"`
}

Nachdem ich mir ein paar Threads angesehen hatte, habe ich versucht, json.Unmarshaljson.NewDecoder().Decode() 但仍然没有运气。上面的截止字符串来自正文,当使用 DecodeUnmarshal 时,它成功地将单个完整对象添加到 apiResponseDataMedium zu verwenden. Ich kann verstehen, wenn das eine große Reaktion ist, aber es scheint so einfach, dass ich davon ausgehen muss, dass ich einen ganz offensichtlichen Anfängerfehler mache.

Jede Hilfe wäre sehr dankbar.


Richtige Antwort


Sie versuchen, eine Zeitzeichenfolge mithilfe eines Formats zu analysieren, das einen Zeitzonenversatz („Z07:00“) enthält.

Sie müssen das Zeitlayout wie folgt anpassen.

layout := "2006-01-02T15:04:05.000000"

Ihre Fehlerbehandlung ist falsch, deshalb können Sie auch mit einer falschen Antwort beenden.

Das obige ist der detaillierte Inhalt vonMein API-Antworttext scheint abgeschnitten zu sein?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen