我正在开发一项新服务,其中在C ++应用程序中构建了REST API。 C ++应用程序侦听特定的端口并接收HTTP / S流量,处理发送的内容,然后将HTTP响应发送回去。
这个想法是,我将拥有不同的库,这些库将能够在C ++ API中发布REST API。我可以从任何地方和任何地方获取请求,因此它可能是另一种软件,例如通过CURL或来自浏览器的POST请求。
该API一直有效,直到我正在使用Javascript通过AJAX帖子发送C ++ API请求的库。
因为我要从一个网站到另一个域进行AJAX发布,所以必须使用CORS。刚开始设计此功能时,我使用的是Chrome,但遇到一个问题,Chrome会发送HTTP OPTIONS请求,并且会以“不允许的403方法”作为响应,因为当时我对此并不了解。我调查了一下,找到了所需的东西,然后使它正常工作,以便Chrome发送OPTIONS请求,C ++应用发送200 OK,然后Chrome随后发送实际的AJAX POST。
这在Chrome浏览器中可以完全正常运行,但是,在Internet Explorer和Firefox中进行测试时,浏览器会发送选项,C ++应用程序会返回200 OK,但是没有一家浏览器发送实际的POST请求。
下面是来自Chrome和Firefox的请求标头和响应标头。
Chrome请求标头
Request URL: http://192.168.1.96:500/initialise
Request Method: OPTIONS
Remote Address: 192.168.1.96:500
Referrer Policy: no-referrer-when-downgrade
Provisional headers are shown
Access-Control-Request-Headers: authorisation-token,device_id,session_id
Access-Control-Request-Method: POST
Origin: http://localhost
User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36
Chrome响应标题
Access-Control-Allow-Headers: *
Access-Control-Allow-Methods: POST, OPTIONS
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: session_id
Allow: POST,OPTIONS
Content-Length: 0
Content-Type: application/json
Status Code: 200 OK
Firefox请求标头
Accept: text/html,application/xhtml+xm…plication/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language: en-GB,en;q=0.5
Access-Control-Request-Headers: authorisation-token,device_id,session_id
Access-Control-Request-Method: POST
Connection: keep-alive
Host: 192.168.1.96:500
Origin: http://localhost
Referer: http://localhost/_js/
User-Agent: Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/64.0
Request URL:http://192.168.1.96:500/initialise
Request method:OPTIONS
Remote address:192.168.1.96:500
Firefox响应标题
Access-Control-Allow-Headers: *
Access-Control-Allow-Methods: POST, OPTIONS
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: session_id
Allow: POST,OPTIONS
Content-Length: 0
Content-Type: application/json
Status code:200
下面提供的参考信息是我如何执行ajax请求:
var url = "http://192.168.1.96:500/";
url += api_endpoint;
$.ajax({
type: "POST",
url: url,
async: true,
headers: {
"authorisation-token": app.api_key,
"session_id": app.cookie,
"device_id": app.device_id
},
data: postArray,
crossDomain: true,
success: function(object, status, xhr){
if (api_endpoint === "initialise")
{
app.cookie = xhr.getResponseHeader("session_id");
setCookie("session_id", app.cookie, true);
}
if (callbackResult !== null)
{
callbackResult(object);
}
},
error: function(xhr)
{
console.error("Status: " + xhr.status);
console.error("Status Text:" + xhr.statusText);
console.error("Response Text: " + xhr.responseText);
if (callbackResult !== null)
{
callbackResult(xhr);
}
}
});
我正在使用Jquery执行ajax发布。
任何人都可以看到为什么在这种情况下Firefox在200 OK之后不能发送实际请求的原因,该请求和响应看起来是相同的,并且在Google Chrome浏览器中可以完美地运行。
答案 0 :(得分:3)
我已经感谢@Manoj Purohit的评论再次检查了控制台。我这样做了,发现其中的警告已被过滤,我必须添加以下标头以使其在Firefox和Internet中正常工作-奇怪的是,尽管它在Chrome中已被接受。
this->addHeader("Access-Control-Allow-Headers", "authorisation-token, device_id, session_id");