[英]Sending a POST request with JSON from Android to a node.js server
所以我试图通过Android应用程序的POST请求将一些JSON发送到我的node.js
服务器。 该服务器托管在Heroku上。 我非常确定服务器可以正常工作,因为当我发出curl请求时,一切正常。 我认为错误与我在前端和后端格式化JSON正文的方式有关,并且期望有所不同。
这是我发送请求的Android代码。 这一切都在AsyncTask中 :
HttpURLConnection urlConn = null;
String result = "-1";
JSONObject json = jsonParam[0];
Log.d("postTask: JO",json.toString());
try {
URL url;
DataOutputStream printout;
String address = BASE_URL+"/users/add";
Log.d("sendPost",address);
url = new URL (address);
urlConn = (HttpURLConnection) url.openConnection();
urlConn.setDoInput (true);
urlConn.setDoOutput (true);
urlConn.setUseCaches (false);
urlConn.setRequestMethod("POST");
urlConn.setChunkedStreamingMode(100);
urlConn.setRequestProperty("Content-Type","application/json");
urlConn.connect();
// Send POST output.
printout = new DataOutputStream(urlConn.getOutputStream());
String output = URLEncoder.encode(json.toString(),"UTF-8");
Log.d("postTaskURL",output);
printout.writeUTF(json.toString());
printout.flush();
result = Integer.toString(urlConn.getResponseCode());
printout.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(urlConn !=null)
urlConn.disconnect();
}
return result;
这是对AsyncTask的调用:
postTask task = new postTask();
JSONObject json = new JSONObject();
json.put("username","user");
json.put("password","life");
task.execute(json);
这是我的node.js后端:
app.post('/users/add',function(req, res) {
console.log("MADE IT TO THIS FUNCTION");
var user = req.body.user;
var password = req.body.password;
console.log("User: " + user + "\nPassword: " + password);
var rC = model.add(user,password, function(returnCode){
console.log("returnCode: " + returnCode.toString());
sendJSON(res,returnCode);
});
if (rC != undefined && rC != null) {
sendJSON(res, rC);
}
});
返回我的Android应用的结果是400错误代码-错误请求。 在启动POST请求时查看Heroku的日志如下:
Error: invalid json
2014-02-18T06:13:25.468224+00:00 app[web.1]: at Object.exports.error (/app/node_modules/express/node_modules/connect/lib/utils.js:60:13)
2014-02-18T06:13:25.468224+00:00 app[web.1]: at IncomingMessage.<anonymous> (/app/node_modules/express/node_modules/connect/lib/middleware/json.js:74:71)
2014-02-18T06:13:25.468224+00:00 app[web.1]: at IncomingMessage.EventEmitter.emit (events.js:92:17)
2014-02-18T06:13:25.468224+00:00 app[web.1]: at process._tickCallback (node.js:415:13)
2014-02-18T06:13:25.468224+00:00 app[web.1]: at _stream_readable.js:920:16
2014-02-18T06:13:25.499015+00:00 heroku[router]: at=info method=POST path=/users/add host=ancient-spire-1285.herokuapp.com request_id=5d148ef8-a74b-4cd5-ae8b-67f0214ee641 fwd="76.102.205.187" dyno=web.1 connect=1ms service=310ms status=400 bytes=521
如果有人对我为什么会收到此错误有任何想法,将不胜感激。 我花了整整一天的时间来调试它,但是却一无所获。
谢谢。
cURL和HttpURLConnection-发布JSON数据
该链接上的答案对我有用。 基本上,采用JSON对象并获得字节表示形式即可。
byte[] outputBytes = "{'value': 7.5}".getBytes("UTF-8");
OutputStream os = httpcon.getOutputStream();
os.write(outputBytes);
os.close();
代替这个: urlConn.setRequestProperty("Content-Type","application/json")
,尝试做这个urlConn.setRequestProperty("Content-Type","text/plain")
。
该线程解决了此问题,尽管适用于Ajax而不是Android。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.