3

我正在尝试通过 jQuery 对远程服务进行身份验证。首先,我验证我可以在浏览器之外执行此操作:

 curl -X POST -H "Content-Type: application/json" -H "Accept: appliction/json" -d '{"username":"...","password":"..."}' http://example.com/auth

这成功地返回了一个令牌。

现在我用 jQuery 试试:

$.ajax({
    url: "http://example.com/auth",
    type: "POST",
    dataType: "json",
    contentType: "json",
    data: {username:"...",password:"..."},
    error: function(data){alert(JSON.stringify(data))},
    success: function(data){alert(JSON.stringify(data))}
});

我收到服务器错误 (500)。显然我做错了什么。这是我第一次尝试在 jQuery 中进行 POST,所以我不知道如何确定问题所在。我在这里做错了什么?

PS 如果我已经有一个令牌,我可以通过 jQuery 成功执行 GET 请求:

$.ajax({
    url: "http://example.com/stuff?token=f42652adcbfe3ed9d59fae62b5267b8d",
    type: "GET",
    dataType: "json",
    error: function(data){alert(JSON.stringify(data))},
    success: function(data){alert(JSON.stringify(data))}
});
4

6 回答 6

3

我唯一注意到的是数据表示的不同。查看原始请求中的数据:

-d '{"username":"...","password":"..."}'

以及 AJAX 请求中的数据:

data: {username:"...",password:"..."}

前者将键包装在字符串中,而后者没有。整个事情也应该是一个字符串。尝试:

data: '{"username":"...","password":"..."}'

我相信,这通常与JSON 格式的数据更加一致。如果不将键包装在字符串中,它可能是 JavaScript 对象,但不是 JSON 数据。

于 2013-11-08T18:15:06.680 回答
1

更新:哎呀错过了一条评论说 stringify 不起作用。我会把这个留给后代

有时候发送Json的时候需要对数据进行字符串化,否则jquery可能会将对象序列化为param字符串而不是整个对象。这取决于您的服务器如何将请求查询绑定到对象。尽管。您可以调试服务器请求还是无法控制?

尝试这样做(前提是您使用的是半现代浏览器):

   data: JSON.stringify({ your: data}) 
于 2013-11-08T18:27:38.103 回答
0

谢谢大家的帮助。每一条小建议都帮助我找到了解决方案。我已经在评论中说过了,但这里是解决方案:

  1. dataType 正确列为“json”,但 contentType 应列为“application/json”。

  2. 内容必须包装在 JSON.stringify 中。

于 2013-11-08T18:36:54.657 回答
0

500内部服务器错误

服务器遇到了一个意外情况,导致它无法完成请求。

来自 url 的 Json 响应可能是原因,您可以注释 stringfy 函数并提醒响应。您可以使用 try/catch 方法作为响应并检查错误。

于 2013-11-08T18:20:25.583 回答
0

您是否发布到与加载 js 的域相同的域?如果不是,您需要使用 jsonp 并确保服务器明确接受您的请求,我相信。

于 2013-11-08T18:41:15.123 回答
0

1) 在工具中打开网络 (f12)

2) 选择“网络”

3) 选择错误行

4) 在右侧打开“Body”

5) 在标题中,您可以看到错误描述 eq。

<title>The parameters dictionary contains a null entry for parameter 'Id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Delete(Int32)' in 'BosCatalog.Controllers.ProductsController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.<br>Parameter name: parameters</title>

于 2017-12-07T11:06:32.967 回答