2015-07-22 10 views
14

Próbowałem uczyć się z wielu przykładów na SO i innych witrynach, ale nie mogę zrozumieć, dlaczego przykład zhackowany razem nie działa. Buduję niewielką aplikację typu proof-of-concept, która rozpoznaje mowę i wysyła ją (tekst) jako żądanie POST do serwera node.js. Rozpoznanie mowy, które potwierdziłem, działa, a serwer otrzymuje połączenia z regularnej wizyty w przeglądarce, więc jestem przekonany, że problem dotyczy samej aplikacji. Czy brakuje mi czegoś małego i głupiego? Nie są zgłaszane żadne błędy, ale serwer nigdy nie rozpoznaje połączenia. Z góry dziękuję za radę lub pomoc.Wysyłanie żądania HTTP Post z Androidem

Stosowna (główna działalność i potrzeby AsyncTask) Java:

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"; 
     } 
    } 
} 

Server 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

Spróbuj tego posta chromowanymi aplikacjami https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo i zobaczyć nodejs odpowiedzi serwera – zzas11

+0

odpowiedział kodem 200 i wrócił tą samą odpowiedź jak przeglądarce . Nie przejmuję się jeszcze transmisją danych, chcę tylko, żeby serwer trafił z aplikacji do rejestracji. –

+0

Czy próbujesz trafić na localhost? z emulatora lub urządzenia? –

Odpowiedz

25

Można użyć klient HTTP z Apache Commons. Na przykład:

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

Można użyć Volley Android Networking Biblioteka, aby zamieścić swoje dane. Oficjalny dokument to here.

Osobiście używam Android Asynchronous Http Client dla kilku projektów klientów REST.

Inne narzędzie, które można przetestować to Retrofit.

+10

To rozwiązanie jest przestarzałe. Aktualizowanie odpowiedzi – zzas11

+0

Przepraszam, że zajęło to tyle czasu, ale w końcu udało mi się to obrócić i Android Async Http Client działa jak urok. Dzięki wielkie! –

+1

Jak urok nie jest na zawsze :) "NameValuePair" jest przestarzałe! – delive