无法对 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)获取的结果,但是当我输入城市名称时,我没有得到任何响应