我是第一次涉足GO,我用來取得股票價格的API 接受多個股票代號(想想股票ID; NVDA => Nvidia),以減少我有限的API 呼叫。 然而,當嘗試獲取多個程式碼時,正文似乎被切斷:
{ "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 ": ""
在郵差直接對 Stock API 進行精確呼叫會回傳:
{ "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" } ] }
我認為我做錯了什麼(昨天之前我從未接觸過 GO) 相關程式碼如下:
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 }
上下文結構:
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"` }
在查看了幾個線程後,我嘗試使用 json.Unmarshal
和 json.NewDecoder().Decode()
但仍然沒有運氣。上面的截止字串來自正文,當使用 Decode
或 Unmarshal
時,它成功地將單一完整物件新增至 apiResponseData
中。我可以理解這是否是一個巨大的回應,但這看起來很簡單,所以我不得不假設我犯了一個非常明顯的菜鳥錯誤。
任何幫助將不勝感激。
您正在嘗試使用包含時區偏移量(“Z07:00”)的格式來解析時間字串。
您需要將時間佈局調整為以下。
layout := "2006-01-02T15:04:05.000000"
您的錯誤處理不正確,這就是為什麼您也能夠以錯誤的回應退出。
以上是我的 API 回應正文似乎被截斷了?的詳細內容。更多資訊請關注PHP中文網其他相關文章!