我从Dynamics CRM中的JavaScript Webresource向Google API进行了简单的电话。
var xhr = new XMLHttpRequest();
xhr.open("GET", 'https://maps.googleapis.com/maps/api/place/queryautocomplete/json?input={' + searchString + '}&types=address&language=en&crossDomain=true&key=[ourKey]', true);
xhr.setRequestHeader('Access-Control-Allow-Origin', '*');
xhr.setRequestHeader('Access-Control-Allow-Methods', 'GET,POST');
xhr.onload = function () {
var response = JSON.parse(xhr.responseText);
//do something with the response here
};
xhr.send();
我在IE中获得以下消息和错误:
*sec7118:https://maps.googleapis.com/maps/place/place/queryautocolplete/json?input= {55 llllll}[我们的钥匙]需要交叉来源资源共享(CORS(。文件:clientapiwrapper.aspx
sec7119:https://maps.googleapis.com/maps/place/place/queryautocospollete/json?input= {55 llllllll}我们的钥匙]需要CORS前飞行。文件:clientapiwrapper.aspx
sec7120:Origin http://[ururl]在Access-Control-Allow-Origin标头中找不到。文件:clientapiwrapper.aspx
script7002:xmlhttprequest:网络错误0x80070005,访问被拒绝。文件:clientapiwrapper.aspx*
浏览相关的材料和指南,我相信我已经做对了。
我也尝试过,尽管我希望这里有一个问题:
jquery.post('https://maps.googleapis.com/maps/api/place/queryautocomplete/json?input= {' searchstring '}= [ourkey]',函数(地址({
尝试{
//Do something with returned addresses here...
}
catch (e) {
alert("AutoComplete ErrorInt: " + e.message);
}
});
我敢肯定这是一个与Dynamics CRM相关的问题,在该问题中,动态在自己的沙盒外部都无法很好地发挥作用。
任何人都可以建议在Dynamics CRM领域中提出修复吗?
谢谢
Access-Control-Allow-Origin
和 Access-Control-Allow-Methods
标头是响应标题,它们是根据您的请求从服务器发送的。
只需将它们完全从XHR请求代码中删除。浏览器将为您添加Origin
标头(您未明确指定(,并且maps.googleapis.com
上的服务器应添加所需的CORS响应标头(Access-Control-Allow-Origin
,可能还有其他一些(。
如果您在此之后仍然遇到问题,请为GET请求发布一套完整的请求和响应标题(以及如果有的话,则适用于前飞行选项请求(。
编辑以下注释
好吧,这就是我从您的评论中看到的(格式(:
var xhr = new XMLHttpRequest();
xhr.open("GET", 'maps.googleapis.com/maps/api/place/queryautocomplete/…{' +
searchString + '}&types=address&language=en&crossDomain=true&key=[ourKey]',
true);
xhr.onload = function () {
var response = JSON.parse(xhr.responseText);
//do something with the response
};
xhr.send();
Errors: SEC7120: Origin http://[ourUrl] not found in Access-Control-Allow-Origin header. File: ClientApiWrapper.aspx
GET /maps/api/place/queryautocomplete/json?input={55%20saddl}&types=address&language=en&crossDomain=true&key=[ourKey] HTTP/1.1
Accept: /
Referer: http://[ourURL]/[ourOrg]/form/ClientApiWrapper.aspx?ver=1166920881
Accept-Language: en-CA
Origin: http://[ourURL]
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Host: maps.googleapis.com
Connection: Keep-Alive
Cache-Control: no-cache
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Date: Wed, 25 Apr 2018 16:26:36 GMT
Expires: Wed, 25 Apr 2018 16:31:36 GMT
Cache-Control: public, max-age=300
Server: scaffolding on HTTPServer2
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
好,所以浏览器是发送原始标头。这意味着您的服务器需要返回一些CORS响应标头。
因此,您需要在 server 上添加代码以返回以下CORS响应标头以进行选项,获取和发布请求:
Access-Control-Allow-Origin: <value of Origin request header>
(我的意思是服务器应提取原点请求标头的值(即http://[ourURL]
(,然后将其返回为Access-Control-Allow-Origin
响应标头的值。不要将其作为' http://[ourURL]
' - 这样撒谎!(。
您还需要 需要返回以下其他CORS标题以获取选项请求:
Access-Control-Allow-Methods: <value-of-Access-Control-Request-Method request header>
Access-Control-Allow-Headers: <value-of-Access-Control-Request-Headers request header>
Access-Control-Max-Age: 86400
最后一个指定浏览器应缓存前覆响应的秒数,因此每次都不需要制作。它是可选的,但建议。86400秒= 1天。
应该让您前进。
因此,毕竟,我在Google API Dev支持上发布了一个问题。这是回来的……希望它可以帮助他人尝试类似的事情:
感谢您的发布。我可以看到您在HTTP请求中使用了Place API Web服务。PLESS API Web服务不打算在客户端应用程序上使用,因为响应不包含访问控制 - 允许原始标头。在重复问题中查看更多内容。要在JS应用程序中使用place api,建议您使用MAPS JavaScript API中的plotes库1.此库提供了一个autoComplete2功能,您可以在API Web服务中找到该功能。如果您想要Web服务的QueryAutococtement功能,JavaScript API如文档3中所述的getQueryPredictions((函数。