无法在HTTP POST中发送字符串

时间:2014-12-13 02:41:13

标签: javascript html django post

所以,我是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")

提前致谢!

3 个答案:

答案 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? 并且还提供了具体细节的链接。