【发布时间】:2021-07-26 02:29:41
【问题描述】:
我在 Stack Overflow 上遇到过类似的问题,但没有什么对我有用。最接近的例子可能是this one。
我一直在做的是向 NASA POWER API 发送 API 请求。我的请求如下所示:
"https://power.larc.nasa.gov/beta/api/temporal/hourly/point?start=20080101&end=20180101&latitude=-34.96260135&longitude=-54.9401847474085&community=re¶meters=ALLSKY_SFC_SW_DWN,T2M,WS2M&format=json&user= dataqueryabed&header=false&time-standard=lst"
我使用 GET 来下载信息。我得到 200 代码,返回的响应对象在我看来似乎很好。现在,当我下载数据时,我给它一个经度和纬度对。我通常能够完成这项工作,但有时却不行。
我尝试将 JSON 对象转换为数据框,如下所示:
#Step 1:
content(some_request, as = "text")
#Step 2:
some_response_unframed = fromJSON(rawToChar(response_given$content))
#Step 3:
response_framed = enframe(unlist(some_response_unframed))
#What we want is "response framed"
上述方法有时似乎有效,但有时无效,我不知道为什么。例如,坐标纬度-34.9626,经度=-54.9402,这很好用。但是,如果我尝试使用坐标经度 39.288 和纬度 -6.280 的请求,我可以正确下载所有内容,并且它可以一直运行到“fromJSON”步骤:
tanzania_offshore_try_now = fromJSON(rawToChar(tanzania_offshore_data$content))
Error: lexical error: invalid char in json text.
<!DOCTYPE HTML PUBLIC "-//IETF/
(right here) ------^
我想不通:
- 为什么它适用于某些配对而不适用于其他配对
- 我应该如何像之前发布的答案那样编辑 JSON 内容?在这个阶段我没有从文件或任何东西中读取,它是 R 中的“响应”类型对象。
提前致谢!
编辑感谢@MrFlick 指出显而易见的,不知道我是怎么错过的。所以,看来我需要做的就是重新下载数据。我现在一切正常。我很困惑为什么请求似乎在一分钟而不是另一分钟有效,我最好的猜测是他们的服务器不希望您连续下载太多太相似的请求。不确定我现在是否担心我的脚本正在运行。再次感谢@MrFlick。
【问题讨论】:
-
如果您尝试访问不起作用的 URL,大概是 power.larc.nasa.gov/beta/api/temporal/hourly/…,您会看到没有返回任何数据。只是一条错误消息。该错误消息不是 JSON 格式。您需要联系提供 API 的人员以了解为什么没有返回数据。
-
您好,谢谢。也许我应该更清楚,但是:不,在某些情况下返回了一些数据,我仍然收到此消息。我将更新问题以说明如何。不过,谢谢。
-
@MrFlick - 当我点击您发布的链接时,它会返回原始 JSON 数据,因此这似乎是服务器端问题,可能 API 间歇性过载。
-
@27ϕ9 哦。有趣的。我收到 502 代理错误(代理服务器从上游服务器收到无效响应。)
-
我又点击了几次,也看到了 502 代理错误。 OP,您可以在函数中构建一些错误检查,并在失败时重试 - 使用
jsonlite::validate()检查下载的内容是有效的 JSON。