使用Android发送HTTP发布请求

我一直在尝试从SO和其他站点上的大量示例中学习,但我无法弄清楚为什么我一起入侵的例子不起作用。 我正在构build一个小型概念validation应用程序来识别语音,并将其作为POST请求发送到node.js服务器。 我已经确认了语音识别工作,并且服务器正在接收来自常规浏览器访问的连接,所以我被引导认为这个问题是在应用程序本身。 我是否缺less一些小而愚蠢的东西? 没有错误被抛出,但服务器永远不会识别连接。 提前感谢您的任何build议或帮助。

相关的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..."); 

您可以使用Apache Commons的Http Client。 例如:

 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

您可以使用Volley Androidnetworking库发布您的数据。 官方文件在这里 。

我个人使用AndroidasynchronousHttp客户端几个REST客户端项目。

其他有益探索的工具是Retrofit 。