我正在开发一个javascript应用程序来控制一些智能电视,但角度预先点亮OPTIONS请求,然后尝试发送我要发送的POST请求(SOAP)。设备返回具有正确Access-Control-Allow-Origin: *
的响应,但有角度拒绝发送POST请求。
当然,我无法更改设备服务器的配置以发送另一个标题为“需要”的标题,我需要发送Cookie
和Content-Type
。
我该如何解决这个问题?
更新请求(底部)和响应(顶部)标题的屏幕截图。
使用相关的角度代码更新:
应用程序配置为:
app.config(['$httpProvider',function($httpProvider) {
$httpProvider.defaults.withCredentials = true;
}])
请求是:
var body = '<?xml version="1.0"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:X_SendIRCC xmlns:u="urn:schemas-sony-com:service:IRCC:1"><IRCCCode>{command}</IRCCCode></u:X_SendIRCC></s:Body></s:Envelope>';
var headers = {
"Content-Type": "text/xml; charset=UTF-8",
"SOAPACTION": "urn:schemas-sony-com:service:IRCC:1#X_SendIRCC"
};
return $http({
method:"POST",
url: "http://{ip}/sony/IRCC".replace("{ip}", config.ip),
data: body.replace("{command}", signal),
headers: headers
});
答案 0 :(得分:1)
仅在您的浏览器不知道选项时才会获取选项, 因此,如果您事先可以从服务器(通常不是通过肥皂)加载某些内容,例如包含不可见的图像,那么您的浏览器应该已经知道这些选项而不是重新请求它们。
答案 1 :(得分:1)
我相信你的问题是withCredentials
。使用withCredentials
时,服务器必须表示允许凭据。在一个不需要预检的简单GET
请求中,浏览器应该保留您应用中的任何此类响应;在预检请求中,它不应发送实际请求。
以下是mozilla https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials
的最佳说明它说:
但浏览器将拒绝任何没有Access-Control-Allow-Credentials:true标头的响应, 并且不会将响应提供给调用的Web内容
如果您查看预检响应,则会看到标题:
Access-Control-Allow-Headers: "content-type,soapaction"
Access-Control-Allow-Origin: "*"
但所需的Access-Control-Allow-Credentials
标题不存在。