【问题标题】:Ajax POST error (400 BAD REQUEST)Ajax POST 错误(400 错误请求)
【发布时间】:2018-03-05 12:10:34
【问题描述】:

提前感谢您对我的帮助。

我正在尝试在 URL 中传递 TOKEN 的位置进行 POST,并且我也想传递另一个参数,以便将信息保存在数据库中。我有这个:

    $("#btnAddCompany").click(function(e) {
    var token = "123";
    var companyValue = document.getElementById("companyValue").value;
    var obj ={CompanyId: 4 ,Name: companyValue }
    var postData = JSON.stringify(obj);
    console.log(postData);
      $.ajax({  
        type: "POST", //REQUEST TYPE
        dataType: "json", //RESPONSE TYPE
        contentType: "application/json",
        data: postData,
        url: "http://banametric.ddns.net/BanaMetricWebServices/BanaSov_WS.svc/CompanySave/"+token, 
        success: function(data) {
            toastr.success("Lidl Adicionado!");
        },
        error: function(err) {
            console.log("AJAX error in request: " + JSON.stringify(err, null, 2));
        }
    }).always(function(jqXHR, textStatus) {
        if (textStatus != "success") {
            alert("Error: " + jqXHR.statusText);
        }
    })
});

但我收到 400 错误(错误请求),所以我认为我做错了什么,但我不知道是什么。错误跟踪是这样的:

请求中的 AJAX 错误:{ "readyState": 4, "responseText": "\r\n

服务器在处理请求时遇到错误。这 exception message is '传入的消息有意外的消息 格式“原始”。该操作的预期消息格式是 'Xml','Json'。这可能是因为 WebContentTypeMapper 尚未 在绑定上配置。查看服务器日志了解更多信息 细节。异常堆栈跟踪是:

\r\n

at System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest(消息 消息,Object[] 参数)\r\n at

【问题讨论】:

  • 你可以试试 contentType: "application/json"
  • @bipinpatel 我已经尝试过了,现在又遇到了另一个错误。 405(不允许的方法)

标签: javascript ajax post error-handling


【解决方案1】:

错误是因为

操作的预期消息格式为“Xml”、“Json”。 所以你可以在你的ajax调用中传递contentType

$.ajax({
 ....,

  contentType: "application/json"
})

【讨论】:

  • 我已经尝试过了,现在又遇到了另一个错误。 405(不允许的方法)
  • 你用的是c#还是其他的哪个后端?
  • 我使用 C# 是的。我所有的支持都在 C# 中
  • 您可以尝试使用 data: obj,(没有 JSON.stringfy)我不知道它是否有效,但只是尝试。这是您的数据格式问题
  • 不,无论如何都不工作,我知道问题出在我的数据格式中,但我不知道在哪里。我已经发布了后端结构,因此您可以尝试与我一起分析。提前谢谢你...
【解决方案2】:

我不确定,但这取决于服务器想从你那里读取什么。

服务器不想读取原始字节,它想要 xml 或 json

尝试添加类似的标题

beforeSend: function(xhrObj){
    xhrObj.setRequestHeader("Content-Type","application/json");
    xhrObj.setRequestHeader("Accept","application/json");
},

在 $.ajax() 函数中

【讨论】:

  • “accept”标头用于客户端期望从服务器返回的内容,与此无关。除了现有 ajax 代码中的 datatype: "json" 之外,已经设置了此标头。但是设置内容类型标头是个好主意,是的
  • @ADyson 我已经尝试添加 ContentType,现在我遇到了另一种错误。错误 405(不允许的方法)
  • 当然,我写它只是为了举例)我想设置'contentType:“application/json”'可能足以解决你的问题。
  • @R.Quintal,尝试另一种方法(PUT、PATCH 等)。您应该拥有服务器的 API(文档)。
  • @R.Quintal,很抱歉这个愚蠢的问题,但你确定你使用 POST 方法吗?您的示例脚本有“PUT”。附:抱歉提前提出愚蠢的问题=)
【解决方案3】:

您需要在请求中设置内容类型标头,以通知服务器您以 JSON 格式发送数据。

错误消息告诉您服务器不理解您发送的内容 - 您必须提示它数据采用特定格式,特别是因为再次如错误消息中所述,它允许您以多种不同的格式(在这种情况下为 JSON 或 XML)提交。

添加

contentType: "application/json"

$.ajax 调用中的选项应该可以解决问题。

附:我们看不到您的控制器方法的签名,但您可能还需要在 JSON 中为参数命名,例如data: JSON.stringify({ "companyValue": postData }); 之类的东西,但您的问题中没有足够的信息来确定正确的结构应该是什么。

【讨论】:

    【解决方案4】:
    $("body").on("submit", ".example_form", function() {
    $.ajax({
        url: 'http://example.com/{ROUTE_URL}',
        data: new FormData(this),
        processData: false,
        contentType: false,
        /* OR contentType: "application/json; charset=utf-8"*/
        type: 'POST',
        dataType: "json",
        success: function(data) {
            console.log(data);
        }
    });
    

    });

    【讨论】:

      【解决方案5】:

      而不是这个

       var postData = JSON.stringify(companyValue);
      

      你为什么不试试这个:

      var obj ={token :token ,companyValue:companyValue }
      

      然后利用json stringify函数

       var postData = JSON.stringify(obj);
      

      之后在 ajax 调用中只更改 url:

      url: "http://webservice/CompanySave/"
      

      【讨论】:

      • 这只是一个猜测,因为您不知道该方法的签名。 token 可能位于 URL 内,我们无法从可用信息中知道这一点。它也不能解决服务器不理解正在发送的数据格式的事实。
      • @EvilsEmpire 令牌应该在 URL 中。
      猜你喜欢
      • 1970-01-01
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2013-04-07
      • 1970-01-01
      相关资源
      最近更新 更多