将带有JSON的POST请求从Android发送到node.js服务器

将带有JSON的POST请求从Android发送到node.js服务器,android,json,node.js,post,Android,Json,Node.js,Post,因此,我试图通过Android应用程序的POST请求将一些JSON发送到mynode.js服务器。服务器托管在Heroku上。我非常确定服务器工作正常,因为当我发出curl请求时,一切都正常。我认为错误在于我如何在前端格式化JSON主体,而后端则期望有所不同 这是我发送请求的Android代码。这一切都在一个异步任务中: HttpURLConnection urlConn = null; String result = "-1"; JSONObject json

因此,我试图通过Android应用程序的POST请求将一些JSON发送到my
node.js
服务器。服务器托管在Heroku上。我非常确定服务器工作正常,因为当我发出curl请求时,一切都正常。我认为错误在于我如何在前端格式化JSON主体,而后端则期望有所不同

这是我发送请求的Android代码。这一切都在一个异步任务中

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
错误:无效的json
2014-02-18T06:13:25.468224+00:00应用程序[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应用程序[web.1]:输入消息。(/app/node_modules/express/node_modules/connect/lib/middleware/json.js:74:71)
2014-02-18T06:13:25.468224+00:00应用程序[web.1]:在IncomingMessage.EventEmitter.emit(events.js:92:17)
2014-02-18T06:13:25.468224+00:00应用程序[web.1]:在进程中
2014-02-18T06:13:25.468224+00:00应用程序[web.1]:在"流"上。js:920:16
2014-02-18T06:13:25.499015+00:00 heroku[路由器]:at=info-method=POST-path=/users/add-host=agrage-spire-1285.herokuapp.com请求id=5d148ef8-a74b-4cd5-ae8b-67f0214ee641 fwd=“76.102.205.187”dyno=web.1 connect=1ms服务=310ms状态=400字节=521
如果有人知道我为什么会犯这个错误,我将不胜感激。我花了一天的大部分时间试图调试它,但我一事无成


谢谢。

不要这样做:
urlConn.setRequestProperty(“内容类型”、“应用程序/json”)
,尝试这样做
urlConn.setRequestProperty(“内容类型”、“文本/普通”)

这个线程解决了这个问题,尽管是针对Ajax而不是Android

那个链接上的答案对我起了作用。基本上,获取JSON对象并获得字节表示

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

使异步任务成为subclass@MACMAN我做到了
private class postTask扩展了AsyncTask{…}
因此,当我将其切换为“text/plain”时,我没有收到400个错误代码,但我无法解析后端的JSON。从日志来看,尸体好像是空的