【问题标题】:Converting cURL to JQuery.ajax request将 cURL 转换为 JQuery.ajax 请求
【发布时间】:2015-08-15 10:55:06
【问题描述】:

您好,我正在连接一个 API,该 API 使用第 7 层作为 IP 授权方和 eGalaxy 作为凭据授权方,当发送 curl 请求时,会将一行 xml 发送回给我。我目前正在使用 localhost,我已经实现了 Access-Control-Allow-Origin chrome extension

我的 curl 请求如下所示:

curl https://client-url/eGalaxy.aspx -H 'Content-Type:text/html' --data '<?xml version:"1.0" encoding="UTF-8"?><Envelope><Header><SourceID>0</SourceID><MessageID>131</MessageID><MessageType>Authenticate</MessageType></Header><Body><Authenticate><Username>*username*</Username><Password>*password*</Password><PasswordEncrypted>NO</PasswordEncrypted></Authenticate></Body></Envelope>' --insecure

当我尝试创建 ajax 请求时,我收到“无效的 HTTP 状态代码 500”错误和“OPTIONS url”,它会下拉显示:

n.ajaxTransport.k.cors.a.crossDomain.send   @   jquery-2.1.3.js:4
n.extend.ajax   @   jquery-2.1.3.js:4
(anonymous function)    @   VM947:2
InjectedScript._evaluateOn  @   VM899:895
InjectedScript._evaluateAndWrap @   VM899:828
InjectedScript.evaluate @   VM899:694

我的ajax代码如下:

$.ajax({
  url:'https://client-url/eGalaxy.aspx', 
  data:'<?xml version:"1.0" encoding="UTF-8"?><Envelope><Header>
        <SourceID>0</SourceID><MessageID>131</MessageID>
        <MessageType>Authenticate</MessageType></Header><Body>
        <Authenticate><Username>*username*</Username>
        <Password>*password*</Password>
        <PasswordEncrypted>NO</PasswordEncrypted></Authenticate></Body>
        </Envelope>', 
   type:'POST', 
   contentType:'text/xml', 
   dataType:'xml',
   success: function(data){
   },
   error: function(){
   }
 });

任何有关翻译成正确 AJAX 请求的帮助将不胜感激!

编辑:如果这有所不同,这些是 curl 完成时与客户端 xml 一起返回的标头(客户端信息已删除)

这个应用程序也将被制作成一个小部件,因此它不会在托管站点之外运行。

更新 1:我正在使用 @KevinB 的建议,即仍未正确添加 CORS 标头。

这是我更新的 JS 代码,复制自 link:

var url = 'https://client-url/eGalaxy.aspx';
var data = '<?xml version="1.0" encoding="UTF-8"?><Envelope><Header><SourceID>1</SourceID><MessageID>131</MessageID><MessageType>Authenticate</MessageType></Header><Body><Authenticate><Username>*username*</Username><Password>*password</Password><PasswordEncrypted>NO</PasswordEncrypted></Authenticate></Body></Envelope>';
var xhr = createCORSRequest('POST', url);
xhr.send(data);
function createCORSRequest(method, url) {
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr) {
// Check if the XMLHttpRequest object has a "withCredentials" property.
// "withCredentials" only exists on XMLHTTPRequest2 objects.
xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined") {
// Otherwise, check if XDomainRequest.
// XDomainRequest only exists in IE, and is IE's way of making CORS requests.
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
// Otherwise, CORS is not supported by the browser.
xhr = null;
}
return xhr;
}
var xhr = createCORSRequest('GET', url);
if (!xhr) {
throw new Error('CORS not supported');
}

在关闭 CORS Chrome 扩展程序运行时,我收到一个 Access-Control-Allow-Origin =! “空”错误。知道 CORS 需要 Access-Control-Allow-Origin 标头来 =! 'null' 是否会在将来将其制成小部件以放入 Content Manager 系统时出现问题?

将它的来源设置为“www.evil.com”,代码中唯一的错误是它说 xhr.send() 是一个匿名方法。使用断点我可以看到 xhr.send() 中的 xhr 设置为空请求:

> XMLHttpRequest {response: "", responseText: ""}

在 createCORSRequest 中,这一行是未定义的。我已经使用“GET”和“POST”作为方法进行了测试。

xhr.open(method, url, true)

编辑 2: 使用@Fabiano 的方法,我已将 web.config 更改为我怀疑是我的服务器的两个版本(?)。我附上我所经历的截图 到目前为止,没有运气。决定使用xhr.AppendHeader: 我决定使用 xhr.setRequestHeader("Access-Control-Allow-Origin", "*"); eGalaxy.aspx 的网络选项卡标题

【问题讨论】:

  • 马上,您的curl 请求正在设置Content Type: text/html 标头,而您的ajax 请求正在设置Content Type: text/xml 标头。也许这两个应该对齐?
  • 您的 curl 请求是 get 请求,不是吗? 500 错误是服务器的问题。我猜你的curl 请求没有显示相同的错误,因为它实际上没有向服务器发布任何内容。
  • 可能你正面临一个跨域Ajax请求问题。您可以尝试为跨域请求正确设置一些选项。此页面包含相关文档:api.jquery.com/jquery.ajax
  • @Fabiano 那会是什么属性?我在他的代码中没有看到可以使 CORS 请求工作的缺失属性。
  • 确保您的服务器已设置为正确响应预检 (OPTIONS) 请求。

标签: javascript jquery ajax google-chrome post


【解决方案1】:

您的 XML 中有错误。您输入了version:"1.0",这会使 XML 无效。 更改为version="1.0" 并尝试提出您的请求。它应该工作。 这可能是“错误请求”错误的原因。

您可以在此处验证您的 XML:enter link description here

编辑:经过一番研究,问题可能出在您的服务器发送的标头上。您的服务器(或页面,在这种情况下为 .aspx)似乎跳过了您需要的标题,即“Access-Control-Allow-Origin:*”。

看这个链接:http://enable-cors.org/server.html 该站点向您展示了如何为您的服务器实现它。由于您请求的页面称为 eGalaxy.aspx,因此您有两种方法来实现标头:

1- 如果页面是简单的 ASP.NET 应用程序,则添加行 Response.AppendHeader("Access-Control-Allow-Origin", "*");。如果它使用 Web API 2,您需要实现不同的方式,如下所示:http://enable-cors.org/server_aspnet.html

2- 编辑服务器根目录下的 web.config 文件,并在标签内添加以下行:

   <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="*" />
     </customHeaders>
   </httpProtocol>

对于 ASP.NET 应用程序,您可以使用这些方法。我提到的链接有其他应用程序的解决方案,看看并选择合适的。 :)

请注意,值 * 告诉您您的服务器将接受任何跨域请求。这可能会导致安全问题,因此您能做的最好的事情就是使用您的域地址而不是 *。

希望对你有帮助!

【讨论】:

  • 你看过这个帖子吗? stackoverflow.com/questions/3595515/… 看起来像你的问题。我认为你的标题没有问题,但也许这个线程的解决方案对你有用。
  • 你也可以阅读这篇关于 CORS 的文章:nczonline.net/blog/2010/05/25/… 我认为你以后不会有这个问题,因为一旦服务器允许源,那么 CORS 请求将始终被接受.访问控制允许来源 =! “null”表示您的请求未发送 Access-Control-Allow-Origin。您的请求应发送“*”值或您的客户地址。一旦你发送这个并且这个地址在服务器的白名单上,那么请求应该可以正常工作。我希望它对你有意义并且对你有所帮助。
  • 我找到了另一个关于 CORS 的有用教程:html5rocks.com/en/tutorials/cors 在您在此处发布的黑屏上,我看不到从服务器发送的“Origin”标头。您的服务器是否配置为允许 CORS 请求?可能缺少服务器端的某些配置,因为您的代码看起来不错。
  • 您使用的网络服务器是什么? IIS、Apache……你知道吗?需要对其进行一些配置。让我知道你在用什么。
  • 抱歉重复的链接...我没看到嘿嘿
猜你喜欢
  • 2015-06-13
  • 1970-01-01
  • 2017-08-03
  • 2018-04-16
  • 2021-02-06
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多