PUT 的 Azure 搜索和 CORS 问题
Azure Search and CORS issue with PUT
这是我第一个 post 的 follow-up 问题。我已成功将我的 AngularJS 网站部署到 Azure,我可以使用 REST API GET 方法与 Azure 搜索进行交互。现在我正面临 PUT 方法的问题。它抱怨说我的飞行前请求没有通过控制检查。通过检查网络流量,我可以看到浏览器正在对 Azure 搜索执行 OPTIONS 请求方法,响应代码为 404 Not Found。
我注意到其他人也遇到过这个 problem ,解决方法是使用标准定价等级。我已经在标准版上了,但问题仍然存在。我的 Angular 搜索 CORS 已设置为“*”。我试图通过添加 headers 选项来修改我的客户端 AngularJS $http 代码,但仍然无法正常工作。
任何想法将不胜感激。
更新 #2 以回答@Bruce Johnston,我想我不能将太多代码粘贴为评论块,所以我将它们放在这里。
这是一个正在运行的 $http.get:
$http.get("https://mywebsibe/indexes/contact1/docs?api-version=2016-09-01",
{
headers: {
"Accept": "application/json",
"api-key": "xxx"
},
params: {
//api-version: '2016-09-01',
queryType: "full",
search: searchString
}
}
)
这是遇到 CORS 问题的 PUT:
$http.put("https://mywebsite/indexes/contact1/docs?api-version=2017-11-11",
{
headers: {
"Access-Control-Allow-Credentials": "true",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "POST, GET, OPTIONS, DELETE",
"Access-Control-Allow-Headers": "Origin, X-Requested-With, Content-Type, Accept",
"Accept": "application/json",
"api-key": "xxx"
},
data: {
"value": [
{
"@search.action": "upload",
"ContactId": "id1",
"FirstName": "New",
"LastName": "Guy",
"Dob": "1990-01-31",
"Gender": "M",
"Email": "ng@somewhere.org"
}
]
}
这里有一些问题阻止了它的工作。
首先,主机名似乎不正确。它们应该是后缀为 .search.windows.net
的完全限定域名,但事实并非如此。
其次,由于三个原因,PUT 请求将无法工作:
- 它 returns 404 因为 URL 不正确,假设您正在尝试将文档上传到索引。索引 API 的 URL 是
https://<search-service-name>.search.windows.net/indexes/<index-name>/docs/index
.
- 索引 API 是通过 POST 访问的,而不是 PUT。
- 即使您有正确的 URL 和 HTTP 方法,CORS 也不支持索引 API。 Azure 搜索仅支持通过 CORS 的查询操作。不支持管理操作或修改数据的操作。这已记录在案 here.
如果您的目标是将文档从浏览器上传到您的索引,您将需要以某种方式代理该请求。通常我们建议从您自己的 Web API/middle 层调用 Azure 搜索,因为这样可以避免将您的 api-密钥发送到浏览器。
这是我第一个 post 的 follow-up 问题。我已成功将我的 AngularJS 网站部署到 Azure,我可以使用 REST API GET 方法与 Azure 搜索进行交互。现在我正面临 PUT 方法的问题。它抱怨说我的飞行前请求没有通过控制检查。通过检查网络流量,我可以看到浏览器正在对 Azure 搜索执行 OPTIONS 请求方法,响应代码为 404 Not Found。
我注意到其他人也遇到过这个 problem ,解决方法是使用标准定价等级。我已经在标准版上了,但问题仍然存在。我的 Angular 搜索 CORS 已设置为“*”。我试图通过添加 headers 选项来修改我的客户端 AngularJS $http 代码,但仍然无法正常工作。
任何想法将不胜感激。
更新 #2 以回答@Bruce Johnston,我想我不能将太多代码粘贴为评论块,所以我将它们放在这里。
这是一个正在运行的 $http.get:
$http.get("https://mywebsibe/indexes/contact1/docs?api-version=2016-09-01",
{
headers: {
"Accept": "application/json",
"api-key": "xxx"
},
params: {
//api-version: '2016-09-01',
queryType: "full",
search: searchString
}
}
)
这是遇到 CORS 问题的 PUT:
$http.put("https://mywebsite/indexes/contact1/docs?api-version=2017-11-11",
{
headers: {
"Access-Control-Allow-Credentials": "true",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "POST, GET, OPTIONS, DELETE",
"Access-Control-Allow-Headers": "Origin, X-Requested-With, Content-Type, Accept",
"Accept": "application/json",
"api-key": "xxx"
},
data: {
"value": [
{
"@search.action": "upload",
"ContactId": "id1",
"FirstName": "New",
"LastName": "Guy",
"Dob": "1990-01-31",
"Gender": "M",
"Email": "ng@somewhere.org"
}
]
}
这里有一些问题阻止了它的工作。
首先,主机名似乎不正确。它们应该是后缀为 .search.windows.net
的完全限定域名,但事实并非如此。
其次,由于三个原因,PUT 请求将无法工作:
- 它 returns 404 因为 URL 不正确,假设您正在尝试将文档上传到索引。索引 API 的 URL 是
https://<search-service-name>.search.windows.net/indexes/<index-name>/docs/index
. - 索引 API 是通过 POST 访问的,而不是 PUT。
- 即使您有正确的 URL 和 HTTP 方法,CORS 也不支持索引 API。 Azure 搜索仅支持通过 CORS 的查询操作。不支持管理操作或修改数据的操作。这已记录在案 here.
如果您的目标是将文档从浏览器上传到您的索引,您将需要以某种方式代理该请求。通常我们建议从您自己的 Web API/middle 层调用 Azure 搜索,因为这样可以避免将您的 api-密钥发送到浏览器。