发送带有JSON的POST请求到一个node.js服务器

所以我试图通过来自Android应用程序的POST请求发送一些JSON到我的node.js服务器。 服务器托pipe在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 

如果有人有任何想法,为什么我得到这个错误,这将不胜感激。 我花了大部分时间试图debugging这一点,我越来越没有。

谢谢。

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")

这个线程解决了这个问题,尽pipeAjax而不是Android。

无效的JSON GET请求Express.js