Enviar solicitud de publicación HTTP con Android

He intentado aprender de toneladas de ejemplos en SO y otros sitios, pero no puedo entender por qué el ejemplo que he pirateado no funciona. Estoy construyendo una pequeña aplicación de prueba de concepto que reconoce el habla y la envía (el texto) como una solicitud POST a un servidor node.js. El reconocimiento de voz que he confirmado que funciona y el servidor está recibiendo conexiones de una visita normal al navegador, por lo que me hacen creer que el problema está en la aplicación en sí. ¿Me estoy perdiendo algo pequeño y estúpido? No se generan errores, pero el servidor nunca reconoce una conexión. Gracias de antemano por cualquier consejo o ayuda.

Java relevante (actividad principal y la AsyncTask necesaria):

protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1001) { if (resultCode == RESULT_OK) { ArrayList 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 { @Override protected String doInBackground(String... data) { try { URL url = new URL("http://: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"; } } } 

Servidor 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..."); 

Puede usar Http Client de Apache Commons. Por ejemplo:

 private class PostTask extends AsyncTask { @Override protected String doInBackground(String... data) { // Create a new HttpClient and Post Header HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://:3000"); try { //add data List nameValuePairs = new ArrayList(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) { } } } 

ACTUALIZAR

Puede usar Volley Android Networking Library para publicar sus datos. El documento oficial está aquí .

Yo personalmente uso Android Asynchronous Http Client para algunos proyectos de clientes REST.

Otra herramienta que es buena para explorar es Retrofit .