用Android发送HTTP POST请求

问题描述:

我一直在尝试从SO和其他网站上的大量示例中学习,但我无法弄清为什么我一起入侵的示例无法正常工作。我正在构建一个小概念验证应用程序,用于识别语音并将其作为POST请求发送到node.js服务器。我已经确认可以使用语音识别功能,并且服务器正在接收来自常规浏览器访问的连接,所以我被认为是该应用程序本身的问题。我错过了一些小而愚蠢的东西吗?没有错误被抛出,但服务器永远不会识别连接。预先感谢您的任何建议或帮助。用Android发送HTTP POST请求

相关的Java(主要活动和必要的AsyncTask):

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == 1001) { 
     if (resultCode == RESULT_OK) { 
      ArrayList<String> textMatchList = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); 
      if (!textMatchList.isEmpty()) { 
       String topMatch = textMatchList.get(0); 
       PostTask pt = new PostTask(); 
       pt.execute(topMatch); 
      } 
     } 
    } 
} 

private class PostTask extends AsyncTask<String, String, String> { 
    @Override 
    protected String doInBackground(String... data) { 
     try { 
      URL url = new URL("http://<ip address>:3000"); 
      HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
      conn.setReadTimeout(10000); 
      conn.setConnectTimeout(15000); 
      conn.setRequestMethod("POST"); 
      conn.setDoOutput(true); 
      ContentValues values = new ContentValues(); 
      values.put("data", data[0]); 
      OutputStream os = conn.getOutputStream(); 
      BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); 
      StringBuilder sb = new StringBuilder(); 
      sb.append(URLEncoder.encode("data", "UTF-8")); 
      sb.append("="); 
      sb.append(URLEncoder.encode(data[0], "UTF-8")); 
      writer.write(sb.toString()); 
      writer.flush(); 
      writer.close(); 
      os.close(); 
      conn.connect(); 
      return "Text sent: " + data[0]; 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return "LOL NOPE"; 
     } 
    } 
} 

服务器JS:

var http = require('http'); 
const PORT=3000; 

function handleRequest(request, response){ 
    response.end('It Works!! Path Hit: ' + request.url); 
    console.log("Request got."); 
} 

var server = http.createServer(handleRequest); 
server.listen(PORT, '0.0.0.0'); 
console.log("Listening on 3000..."); 
+0

试试您的文章与这个Chrome应用https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo,看看你用的NodeJS代码200已回复服务器响应 – zzas11

+0

并返回浏览器相同的反应。我甚至不关心数据传输,我只是想让应用程序从应用程序中注册。 –

+0

你试图在本地主机上?从仿真器或设备? –

您可以使用HTTP客户端从Apache的百科全书。例如:

private class PostTask extends AsyncTask<String, String, String> { 
    @Override 
    protected String doInBackground(String... data) { 
    // Create a new HttpClient and Post Header 
    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost("http://<ip address>:3000"); 

    try { 
     //add data 
     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
     nameValuePairs.add(new BasicNameValuePair("data", data[0])); 
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
     //execute http post 
     HttpResponse response = httpclient.execute(httppost); 

    } catch (ClientProtocolException e) { 

    } catch (IOException e) { 

    } 
    } 
} 

UPDATE

您可以使用Android的凌空网络库来发表您的数据。官方文件是here

我个人使用Android Asynchronous Http Client几个REST客户端项目。

其他有用的工具是Retrofit

+10

此解决方案已弃用。更新答案 – zzas11

+0

对不起,它需要这么长时间,但我终于完成了这个旋转,Android异步Http客户端就像一个魅力。非常感谢! –

+1

像一个魅力不是永远:)“NameValuePair”已弃用! – delive