我正在尝试通过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,所以我不知道如何识别问题所在。我在这里做错了什么?
P.S。如果我已经有一个令牌,我可以通过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))}
});
答案 0 :(得分:3)
我唯一注意到的是数据表示的差异。查看原始请求中的数据:
-d '{"username":"...","password":"..."}'
AJAX请求中的数据:
data: {username:"...",password:"..."}
前者将琴键包裹在琴弦中,而后者则不然。整个事情也应该是一个字符串。尝试:
data: '{"username":"...","password":"..."}'
我相信这一般与JSON formatted data更为一致。如果不将字符串包装在字符串中,它可能是一个JavaScript对象,但它不是JSON数据。
答案 1 :(得分:1)
更新:oops错过了一条评论说stringify没有用。我将此留给后人
有时你需要在发送Json时对数据进行字符串化,否则jquery可能会将对象序列化为param字符串而不是整个对象。这取决于服务器如何将请求查询绑定到对象。虽然。你可以调试服务器请求还是不在你的手中?
尝试做(如果您使用的是半现代浏览器):
data: JSON.stringify({ your: data})
答案 2 :(得分:0)
500内部服务器错误
服务器遇到意外情况,导致无法完成请求。
来自url的Json响应可能是原因,你可以注释stringfy函数并提醒响应。您可以在响应中使用try / catch方法并检查错误。
答案 3 :(得分:0)
谢谢大家的帮助。每一条建议都有助于我找到解决方案。我已在评论中说过,但这是解决方案:
dataType正确列为“json”,但contentType应列为“application / json”。
内容必须包装在JSON.stringify中。
答案 4 :(得分:0)
你是否从js加载到同一个域发布?如果不是,您需要使用jsonp并确保服务器明确接受您的请求,我相信。
答案 5 :(得分:0)
1)在工具中打开网络(f12)
2)选择" Network"
3)选择错误行
4)打开"身体"在权利方面
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>