2015-07-22 199 views
14

我一直在嘗試從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

你試圖在本地主機上?從仿真器或設備? –

回答

25

您可以使用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