Javascript 使用AJAX和CORS连接到webService

Javascript 使用AJAX和CORS连接到webService,javascript,cordova,cors,Javascript,Cordova,Cors,我正在开发一个带有html5、css、js和jQuery Mobile的phonegap应用程序,我需要连接到一个已经完成并完全工作的Web服务。问题是访问控制允许源和跨域。好像这还不够难,我还必须考虑身份验证,这对于连接到web服务是必不可少的。我已经做了我的研究,读了很多TUT,尝试了很多解决方案,其中一些使用了jsonP,在我看来这是最接近工作的。问题是我在这方面是新手,没有一个教程看起来不错,所以希望这里有人能给我带路。Web服务是在asp.net中构建的,如果需要,我可以完全访问它。我

我正在开发一个带有html5、css、js和jQuery Mobile的phonegap应用程序,我需要连接到一个已经完成并完全工作的Web服务。问题是访问控制允许源和跨域。好像这还不够难,我还必须考虑身份验证,这对于连接到web服务是必不可少的。我已经做了我的研究,读了很多TUT,尝试了很多解决方案,其中一些使用了jsonP,在我看来这是最接近工作的。问题是我在这方面是新手,没有一个教程看起来不错,所以希望这里有人能给我带路。Web服务是在asp.net中构建的,如果需要,我可以完全访问它。我正在使用AJAX进行“调用”,但我无法通过ForeFront身份验证

以下是JS+AJAX代码:

function conteudoProg() {
    var webMethod = "myURL";
    var credentials = {
      username : "myUser",
      password : "myPass"
  };

$.ajax({
    type : "GET",
    url : webMethod,
    //data: credentials,
    contentType : "application/json; charset=utf-8",
    dataType : "jsonp",
    success : function(msg) {
        alert(msg);
    },
    error : function(e) {
        alert(e.status + " " + e.statusText );
    }
});
}
如果将数据类型从jsonp更改为json,则会出现以下错误:

OPTIONS https://myURL 440 (Login Timeout) 
XMLHttpRequest cannot load https://myURL Origin http://127.0.0.1:8020 is not allowed by Access-Control-Allow-Origin.
对于jsonp,错误如下所示:

Resource interpreted as Script but transferred with MIME type text/html: "https://myURL/CookieAuth.dll?GetLogon?curl=Z2FWSInqueritosZ2FServ…1820135927463_1359737732559Z26_Z3D1359737732605&reason=0&formdir=3". jquery-1.8.2.min.js:2
Uncaught SyntaxError: Unexpected token <
资源解释为脚本,但使用MIME类型text/html传输:https://myURL/CookieAuth.dll?GetLogon?curl=Z2FWSInqueritosZ2FServ…1820135927463_1359737732559Z26_Z3D1359737732605&reason=0&formdir=3”。jquery-1.8.2.min.js:2
未捕获的语法错误:意外标记<

对其他域的请求将导致飞行前
选项
请求,以查看请求域是否可以呼叫此域

接收端需要发出正确的标题,否则您的浏览器将阻止该请求并提供您发布的错误

假设您正在请求从
mydomain.com
webservice.com

然后
webservice.com/api
应发出以下标题:

Access-Control-Allow-Origin: http[s]://mydomain.com
Access-Control-Allow-Credentials: true                      # if you want cookies
Access-Control-Allow-Headers: Content-Type, X-Custom-Header # any extra headers you want to send
确保Web服务了解
选项
请求。它实际上只需要发出一些CORS头,不需要做任何其他事情(比如处理对其API的请求)

您不需要更改AJAX处理程序中的任何内容,它将作为任何其他请求传递。如果您想要cookies,请确保设置http\u request.withCredentials=true


请记住,HTTPS URL被视为不同于HTTP域,请确保您的HTTPS证书有效,如果无效,请求可能会自动失败。如果您正在使用自签名证书(用于测试),请将其添加到浏览器或操作系统白名单中。



至于兼容性。早期版本的Internet Explorer(8及更低版本)使用
ActiveXObject
,此API在CORS中非常糟糕。它不支持身份验证/cookie或自定义标题(例如
内容类型:application/JSON
)。我建议使用JSONp回退。

代码不起作用,因为当您告诉jQuery.ajax方法需要一个数据类型json时,这就是试图将响应解析为的内容。如果响应是html,那么您应该使用数据类型html(或者无,让默认的智能猜测完成它的工作)。有关更多信息,请参阅。

从jsonp错误的外观来看,服务器似乎没有像您预期的那样响应(使用json字符串),而是使用文本/html页面。您能从正在调用的服务生成示例输出吗?它没有用json响应,因为请求被重定向到CookieAuth.dll(即html)进行身份验证,这是缺少的部分。。。