所以,我是Web开发的新手,我需要向服务器发送POST请求。这是代码:
HTML:
<input type="text" class="form-control" placeholder="User ID" name="email" id="email">
<button class="btn btn-theme btn-block" href="#" onClick="httpPOST(email.value)" type="submit"> <iclass="fa fa-lock"></i>SIGN IN</button>
JavaScript的:
function httpPOST(data)
{
var client = new XMLHttpRequest();
var url = "http://193.136.19.86:8080/restaurants/login/";
client.open("POST", url, true);
client.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
client.send(data);
}
如果在email.value中有一个数字,甚至是一个bool,代码工作正常。例如,如果我在“email”输入中写“2”,服务器会很好地接收它。但是,当我写一个真正的电子邮件(或其他字符串)时,它给了我500(内部服务器错误)。
对我做错了什么的想法?
以下是使用Django开发的服务器视图:
@csrf_exempt
def logtrans(request):
#print(request)
context= RequestContext(request,{})
d=json.loads(request.body)
if request.method == 'POST':
print(d)
return HttpResponse("Done")
提前致谢!
答案 0 :(得分:0)
我自己从未使用过Django,但我假设您的问题是使用浏览器中的一种编码(URL编码数据)发送数据,但在服务器上解码不同(JSON)。当您尝试发送的数据不是有效的JSON字符串时,服务器会抛出异常(这会导致500内部服务器错误)。
因此,解决方案是在任何地方使用单个编码。例如,要在任何地方使用JSON,只需在JavaScript代码中更改以下两行:
client.setRequestHeader("Content-Type", "application/json");
client.send(JSON.stringify(data));
答案 1 :(得分:0)
除了你的500或者它甚至可以解决它:
您最好使用$.ajax()
:
function httpPOST(data){
$ajax({
url: "/restaurants/login/"; // always relative path!
type: "post",
data: {data: data}
}).done(function(response){
if(data.ok == 'ok'){
alert(data.response);
}
});
}
aaand your views.py
from django.core.serializers import json
@csrf_exempt
def logtrans(request):
data = {}
if request.method == 'POST':
print request.POST.get('data')
data['ok'] = 'ok'
data['response']= 'Done'
return HttpResponse(json.dumps(data), content_type="application/json")
data['ok'] = 'bad'
data['response']= 'not post request'
return HttpResponse(json.dumps(data), content_type="application/json")
顺便说一句,我不会csrf_exempt
,要小心。
答案 2 :(得分:0)
代码使用“Content-Type”,“application / x-www-form-urlencoded”,因此您的POST数据应采用name:value对的形式,并使用encodeURI(data)或escacpe(data)进行urlencoded。
这篇文章有一般答案Should I URL-encode POST data? 并且还提供了具体细节的链接。