2014-02-18 248 views
1

因此,我想通過來自Android應用的POST請求發送一些JSON到我的node.js服務器。該服務器託管在Heroku上。我很確定服務器工作正常,因爲當我發出一個curl請求時,一切正常。我認爲這個錯誤與我如何格式化前端的後端和後端期望的東西不同。發送帶有JSON的POST請求到一個node.js服務器

這是我的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+"https://stackoverflow.com/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錯誤代碼 - 錯誤的請求。而綜觀Heroku的日誌,當我發起POST請求如下:

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 

如果任何人有在爲什麼我收到此錯誤的任何想法,它會非常感激。我花了大部分時間試圖調試這一點,我無處可去。

謝謝。

+0

使AsyncTask成爲子類 – MACMAN

+1

@MACMAN我這樣做了。 'Private class postTask extends AsyncTask {...}' –

回答

1

cURL and HttpURLConnection - Post JSON Data

這種聯繫上回答奏效了我。基本上,採取JSON對象,並獲得字節表示工作。

byte[] outputBytes = "{'value': 7.5}".getBytes("UTF-8"); 
OutputStream os = httpcon.getOutputStream(); 
os.write(outputBytes); 
os.close(); 
0

取而代之:urlConn.setRequestProperty("Content-Type","application/json"),請嘗試這樣做urlConn.setRequestProperty("Content-Type","text/plain")

該主題解決了這個問題,儘管是針對Ajax而不是Android。

Invalid JSON GET Request Express.js

+0

因此,當我將它切換到「text/plain」時,我沒有收到400錯誤代碼,但我無法解析後端的JSON。從日誌看來,身體似乎是空的 –

相關問題