Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 访问控制允许来源:*Angular.js$http无法识别_Javascript_Angularjs_Http - Fatal编程技术网

Javascript 访问控制允许来源:*Angular.js$http无法识别

Javascript 访问控制允许来源:*Angular.js$http无法识别,javascript,angularjs,http,Javascript,Angularjs,Http,我正在开发一个javascript应用程序来控制一些智能电视,但在尝试我尝试发送的请求后SOAP之前,angular pre lights OPTIONS请求。设备返回一个带有适当访问控制的响应,允许原点:*但angular拒绝发送POST请求 当然,我不能更改设备服务器的配置来发送另一个标题,我需要发送Cookie和内容类型 我怎样才能解决这个问题 使用请求底部和响应顶部标题的屏幕截图进行更新 使用相关角度代码更新: 应用程序配置为: app.config(['$httpProvider',f

我正在开发一个javascript应用程序来控制一些智能电视,但在尝试我尝试发送的请求后SOAP之前,angular pre lights OPTIONS请求。设备返回一个带有适当访问控制的响应,允许原点:*但angular拒绝发送POST请求

当然,我不能更改设备服务器的配置来发送另一个标题,我需要发送Cookie和内容类型

我怎样才能解决这个问题

使用请求底部和响应顶部标题的屏幕截图进行更新

使用相关角度代码更新:

应用程序配置为:

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
});

仅当浏览器不知道这些选项时,才会获取这些选项, 因此,如果您可以预先从服务器上加载一些东西,而不是通过soap(比如包含不可见的图像),那么您的浏览器应该已经知道这些选项,并且不会重新请求它们。

我相信您的问题在于凭据。使用withCredentials时,服务器必须指示允许使用凭据。在一个不需要预处理的简单GET请求中,浏览器应该保留来自应用程序的任何此类响应;在预飞行请求中,它不应发送实际请求

以下是mozilla的最佳描述

它说:

但浏览器将拒绝任何没有访问控制允许凭据的响应:true标头, 并且不会使响应对调用web内容可用

如果查看飞行前响应,您会看到标题:

Access-Control-Allow-Headers: "content-type,soapaction"
Access-Control-Allow-Origin: "*"

但是所需的访问控制允许凭据标头不存在。

您确定angular正在预装选项,而不是您的浏览器吗?好吧,这是浏览器支持和实现的结果。听起来好像还有别的事。您看到了什么错误消息?没有错误消息,只有一个成功的选项请求,但没有POST请求。我可以成功卷曲。当然可以卷曲,因为卷曲没有与浏览器相同的原点访问策略,因此它不需要启用CORS、飞行前选项或发送访问控制允许原点标头的服务器。我曾经遇到过浏览器不能正确发送的问题。你能发布$http代码和Firebug或开发者模式的实际内容,或者任何选项的请求和响应吗?当然,我已经用屏幕截图更新了这个问题。没有什么让我吃惊的。还有$http请求?我需要发送cookies,但我无法向索尼发送补丁,这样他们就可以用Access Control Allow Credentials头修复他们的设备,所以我可能被卡住了。我想我会将应用程序移植到javascript以外的另一种语言,放弃在浏览器上运行应用程序。谢谢你的回复!啊,嗯。我可以试着帮助理解这个问题,但我绝对不能改变你的智能电视设备。我有点惊讶,它支持CORS,正如它在Access Control Allow标头和Access Control Allow Origin标头中所显示的那个样,需要cookies,但不支持它!这可能是因为大多数SDK只考虑本地应用程序的开发,所以他们只是忘记添加必要的头。用其他语言实现的客户端并不关心这些头。是的,但是它们有一些CORS头。奇怪的啊,好吧,这就是你从电视制造商那里得到的应用程序-嗯,电视运行NginX服务器,所以可能有人忘记了标题。但最大的问题是web浏览器不允许您做您想做的事情,因为安全性,当我可以使用任何其他HTTP客户端做同样的事情时。至少浏览器应该为某些应用程序提供启用某些内容的选项。