【问题标题】:XMLHTTPrequest not workingXMLHTTPrequest 不工作
【发布时间】:2014-07-27 09:46:50
【问题描述】:

我通过两种方式向服务发出请求

1) 通过 XMLHTTPRequest->不工作

说 --> JSON.parse 第 1 行 col1 中的数据意外结束

function createCORSRequest(method, url) {
  var xhr = new XMLHttpRequest();
  if ("withCredentials" in xhr) {
    xhr.open(method, url, true);
  } else if (typeof XDomainRequest != "undefined") {
    xhr = new XDomainRequest();
    xhr.open(method, url);
  } else {
    xhr = null;
  }
  return xhr;
}

function sign() {          
  var logincredentials = JSON.stringify({
   "username": "_username",
   "password": "_passsword"
  });

  var url = serviceurl; 
  var xhr = createCORSRequest('POST', url);
  if (!xhr) {
    alert('CORS not supported');
  }

  xhr.onload = function () {
    alert("success : ");
  };

  xhr.onerror = function () {
    alert("failed : ");
  };            
  xhr.setRequestHeader('Content-Type', 'application/jsonrequest; charset=UTF-8');
  xhr.send(logincredentials);
}

2) JQuery Ajax 工作正常

function signJQ() {
  var userData = JSON.stringify({
    "username": "_username",
    "password": "_password"
  });

  $.ajax({
    type:"POST",
    url:"serviceurl",
    contentType: "application/json",
    dataType: "json",
    data:userData,
    success: function(data) {
      alert("success: " + JSON.stringify(data));
    },
    error: function(data) {
      alert("Failed: " + JSON.stringify(data));
    }
  });
}

这两种情况可能有什么不同?

【问题讨论】:

  • 你定义createCORSRequest函数了吗?
  • 你试过哪个浏览器?
  • 据我所知,xhr 有onreadystatechange。所以用它代替onloadonerror。哦,我错了,xhr2 同时适用于 onload 和 onerror。
  • 你可以试试这个:xhr.send("json="+logincredentials);

标签: javascript jquery ajax cors


【解决方案1】:

有错别字:

xhr.setRequestHeader('Content-Type', 'application/jsonrequest; charset=UTF-8');

当然应该是:

xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');

【讨论】:

  • 不是,application/jsonrequest 是正确的 mime 类型
  • 不,它确实不是正确的 mime 类型。请说明此 mime 类型在规范中的定义位置:iana.org/assignments/media-types/media-types.xhtml
  • 哦,我明白了,你是对的。它是 Crockford 的defined here,但从未注册过。他注册了application/json。无论如何,我认为解决这个问题并不重要,但谁知道......
【解决方案2】:

使用 url 附加参数,“?username=_username&password=_passsword”

function sign() {          

            var logincredentials = "?username=_username&password=_passsword";


            var url = serviceurl; 

            var xhr = createCORSRequest('POST', url + logincredentials );
            if (!xhr) {
                alert('CORS not supported');
            }

            xhr.onload = function () {
                alert("success : ");

            };

            xhr.onerror = function () {
                alert("failed : ");

            };          
            xhr.setRequestHeader('Content-Type', 'application/jsonrequest; charset=UTF-8');
            xhr.send();

        }

你还需要函数createCORSRequest()

【讨论】:

    【解决方案3】:

    尝试下面给出的代码 sn-p 可能适用于您的情况:

    函数 createXMLHTTPObject() {

    var xmlhttp = false;
    for (var i=0;i<XMLHttpFactories.length;i++) {
        try {
            xmlhttp = XMLHttpFactories[i]();
        }
        catch (e) {
            continue;
        }
        break;
    }
    return xmlhttp; 
    

    }

    并处理请求:

    函数 createCORSRequest(method,url) {
    var xhr = createXMLHTTPObject();

     xhr.open(method, url,true);
     xhr.setRequestHeader("Accept", "application/json");
     xhr.setRequestHeader("Content-Type", "application/json");
     xhr.onreadystatechange=function()
    {
         if (xhr.readyState)
         {
             if(xhr.status==200){
                 request.success(xhr.responseText);
             }else if(xhr.status!=200){
                 request.error(xhr.responseText)
             }
         }
     }
     xhr.send(body); 
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多