【发布时间】:2019-12-20 21:36:30
【问题描述】:
我正在使用 Angular 8 HttpClient 向 HERE Geocoder API 发出 GET 请求。但由于 CORS preflight 请求失败,该请求被浏览器阻止。
访问 XMLHttpRequest 在 'https://geocoder.api.here.com/6.2/geocode.json?app_id=[APP_ID]&app_code=[APP_CODE]&country=hkg&language=en-GB&searchtext=royal%20view%20hotel' 来自原点“http://localhost:4201”已被 CORS 策略阻止: 对预检请求的响应未通过访问控制检查:它 没有 HTTP ok 状态。
(出于显而易见的原因,我的实际 app id 和 app code 在上述消息中已替换为 [APP_ID] 和 [APP_CODE])
据我了解(在阅读https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS 之后),预检请求 是由浏览器作为 OPTIONS 请求发送的。并且浏览器已经使 HERE API 服务器 的(预检)响应失败,因此阻止了原始 GET 请求。
这可能是 HERE API 服务器对 preflight OPTIONS 请求响应不正确的问题吗?
如果是这样,有人会建议一种模拟预检请求以检查来自 HERE API 的响应的好方法吗?
更新 - 模拟预检请求
我试图模拟来自 Postman 的 preflight 请求,以查看 HERE API 服务器的响应。
请求详情如下。
请求类型:OPTIONS
网址:https://geocoder.api.here.com/6.2/geocode.json
标头参数:
访问控制请求方法:GET
Access-Control-Request-Headers:来源,x-requested-with
来源:http://localhost:4201
对上述请求的响应。
状态:404
响应正文:
<ns2:Error xmlns:ns2="http://www.navteq.com/lbsp/Errors/1" type="PermissionError" subtype="InvalidCredentials">
<Details>invalid credentials for </Details>
</ns2:Error>
如果我尝试将查询参数包含在 URL 中(以包含 app_id 和 app_code),如下所示:
https://geocoder.api.here.com/6.2/geocode.json?app_id=XXXXXXXXXXXXX&app_code=YYYYYYYYYY&country=hkg&language=en-GB&searchtext=royal view hotel
返回相同的错误状态 (404)。响应正文如下所示:
<ns2:Error xmlns:ns2="http://www.navteq.com/lbsp/Errors/1" type="PermissionError" subtype="InvalidCredentials">
<Details>invalid credentials for XXXXXXXXXXXXX</Details>
</ns2:Error>
其中 XXXXXXXXXXXXX 是我的 app_id 参数值。显然,这个值替换了我的实际 app_id,它是有效的,并且在正常 GET 请求中从 Postman 运行时返回结果。
除非我在模拟预检请求时遗漏了一些东西,否则 HERE API 服务器似乎没有正确响应预检。
如有任何帮助和建议,我将不胜感激。
【问题讨论】:
-
如果只需要正确测试响应,就可以在 POSTMAN 中正确测试 API 的响应代码。这是您最终的安全浏览器措施,可以禁用。可以启用 CORS(通过设置代理服务器)
-
您好,感谢您的评论。我已经更新了我的问题,只是看到了你的评论。不知道 HERE api 服务器是否正确响应了浏览器发出的 preflight OPTIONS 请求?
标签: cors here-api angular-httpclient