2013-07-27 129 views
1

我目前正在开发一个需要与服务器交互的应用程序,但我在通过POST接收数据时遇到问题。我使用Django,然后就是我从简单的观点是接受:Android发布UTF-8 HttpURLConnection

<QueryDict: {u'c\r\nlogin': [u'woo']}> 

应该 {“登录”:“woooow”}

的观点就是:

def getDataByPost(request): 
    print '\n\n\n' 
    print request.POST  
    return HttpResponse('') 

和我做了什么,在上SDK中的SRC文件:

URL url = new URL("http://192.168.0.148:8000/data_by_post"); 
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
urlConnection.setDoInput(true); 
urlConnection.setDoOutput(true); 
urlConnection.setChunkedStreamingMode(0); 
String parametros = "login=woooow"; 

urlConnection.setRequestMethod("POST"); 
urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
    urlConnection.setRequestProperty("charset","utf-8"); 
urlConnection.setRequestProperty("Content-Length", "" + Integer.toString(parametros.getBytes().length)); 

    OutputStream os = urlConnection.getOutputStream(); 
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); 
writer.write(parametros); 
writer.close(); 
os.close(); 

我改变了内容长度,看看这是一个问题,然后关于登录价值的问题是固定的,但它是通过硬编码(这不是很酷)。

ps .:除了QueryDict以外的所有东西都运行良好。

我能做些什么来解决这个问题?我在我的java代码中编码错了吗? 谢谢!

+0

尝试删除'Content-Type'并告诉我们会发生什么情况:D –

+0

它返回了相同的结果:( –

回答

4

刚刚得到了我的问题解决了几个修改了解参数,还改变了一些其他的东西。

parameters设置为:

String parameters = "parameter1=" + URLEncoder.encode("SOMETHING","UTF-8"); 

然后,一个的AsyncTask下:

HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setDoOutput(true); 
conn.setDoInput(true); 
conn.setRequestMethod("POST"); 
//not using the .setRequestProperty to the length, but this, solves the problem that i've mentioned 
conn.setFixedLengthStreamingMode(params.getBytes().length); 
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 

PrintWriter out = new PrintWriter(conn.getOutputStream()); 
out.print(params); 
out.close(); 

String response = ""; 
Scanner inStream = new Scanner(conn.getInputStream()); 

while (inStream.hasNextLine()) { 
    response += (inStream.nextLine()); 
} 

然后,有了这个,我得到了来自Django的服务器结果:

<QueryDict: {u'parameter1': [u'SOMETHING']}> 

这是我想要的。

+1

我知道这是一个旧帖子,但您应该添加inStream.close()以防止资源泄漏。 – Mgamerz

相关问题