无法对 openweathermap.org 执行看似简单的 HTTP POST

Posted

技术标签:

【中文标题】无法对 openweathermap.org 执行看似简单的 HTTP POST【英文标题】:Can't perform what seems like a simple HTTP POST to openweathermap.org 【发布时间】:2018-11-04 05:06:07 【问题描述】:

我在 Angular 服务组件中使用 openweathermap.org 发布请求以创建新气象站的功能:

registerStation(registerWeatherStation: RegisterWeatherStation): Observable<Response> 
let params = JSON.stringify(registerWeatherStation)
console.log("params: ",params)
let header = new Headers('Content-Type': 'application/json; charset=utf-8')
let options = new RequestOptions( headers: header )
let url = this.servUrl + 'stations?appid=' + this.weatherAppId
return this
    .http
    .post(url, params, options)

这是来自 Chrome 的开发者工具网络选项卡,显示由上述功能触发的活动。我认为这显示了我的预检请求、来自 openweathermap.org 的预检响应以及我的请求标头:

Preflight Request???  
request url: http://api.openweathermap.org/data/3.0/stations?appid=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  
Request Method: OPTIONS  
Status Code: 404 Not Found  
Remote Address: 162.243.53.59:80  
Referrer Policy: no-referrer-when-downgrade  

Response Headers  
Access-Control-Allow-Credentials: true  
Access-Control-Allow-Methods: GET, POST, PUT, DELETE  
Access-Control-Allow-Origin: *  
Connection: keep-alive  
Content-Length: 42  
Content-Type: application/json; charset=utf-8  
Date: Thu, 24 May 2018 19:57:00 GMT  
Server: openresty  

Request Headers  
Accept: */*  
Accept-Encoding: gzip, deflate  
Accept-Language: en-US,en;q=0.9  
Access-Control-Request-Headers: content-type  
Access-Control-Request-Method: POST  
Connection: keep-alive  
Host: api.openweathermap.org  
Origin: http://localhost:54270  
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/66.0.3359.181 Safari/537.36  

这是我执行的 POST 的 Postman 代码 sn-p,它从 openweathermap.org 获得了有效响应:

POST /data/3.0/stations?appid=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx HTTP/1.1
Host: api.openweathermap.org
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: 25e03224-a9e7-43af-9757-dc37c41af780

"external_id":"Paula's_Ranch_1","name":"Paula's Ranch Weather","latitude":xx.155012,"longitude":-xxx.976649,"altitude":100

我做错了什么?我应该从我的后端执行帖子吗?

【问题讨论】:

是的,我认为您必须改为从后端执行 POST。原因:api.openweathermap.org/data/3.0/stations 似乎实际上并未完全启用 CORS。具体问题:虽然来自该响应的响应包括 Access-Control-Allow-Origin 标头,但不幸的是它无法正确处理 CORS 预检 OPTIONS 请求。而且没有办法解决这个问题,因为为了向该 API 端点发出 POST 请求,您必须将 Content-Type: application/json 标头添加到请求中。但是添加它会触发浏览器发送该端点不处理的选项 谢谢。我昨晚开始将这些东西移动到服务器端,这很好,因为无论如何我都需要去那里向数据库添加和删除东西。我今天回家后就可以完成和测试。我会告诉你进展如何。 【参考方案1】:

将我的 POST 和 GET 请求移动到服务器端代码解决了这个问题。我还使用了restsharp.netcore。干净简单。

【讨论】:

以上是关于无法对 openweathermap.org 执行看似简单的 HTTP POST的主要内容,如果未能解决你的问题,请参考以下文章

使用 getJSON 从 openweathermap.org 获取数据

OpenWeatherMap.ORG API - $.getJSON 不起作用,我没有收到任何数据

如何计算 openweathermap.org JSON 中返回的摄氏温度?

python使用openweathermap API获取全世界主要城市天气信息

我想显示从这个天气 API(https://openweathermap.org/current)获取的结果,但是当我输入城市名称时,我没有得到任何响应

使用 OpenWeatherMap API 会出现 401 错误