web-dev-qa-db-fra.com

Envoi d'une demande de publication HTTP avec Android

J'ai essayé d'apprendre des tonnes d'exemples sur SO et d'autres sites, mais je ne peux pas comprendre pourquoi l'exemple que j'ai piraté ensemble ne fonctionne pas. Je construis une petite application de preuve de concept qui reconnaît la parole et l'envoie (le texte) sous la forme d'une demande POST à un serveur node.js. La reconnaissance vocale que j'ai confirmée fonctionne et le serveur est recevoir des connexions d'une visite régulière du navigateur, donc je suis amené à croire que le problème est dans l'application elle-même. Suis-je en train de manquer quelque chose de petit et de stupide? Aucune erreur n'est lancée mais le serveur ne reconnaît jamais une connexion. Merci d'avance pour tout conseil ou aide.

Pertinent Java (activité principale et AsyncTask nécessaire):

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

Serveur 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...");
14
Kienan Knight-Boehm

Vous pouvez utiliser le client Http d'Apache Commons. Par exemple:

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) {

    }
  }
}

[~ # ~] mise à jour [~ # ~]

Vous pouvez utiliser Volley Android Networking Library pour publier vos données. Le document officiel est ici .

J'utilise personnellement Android Asynchronous Http Client pour quelques REST projets clients.

Un autre outil intéressant à explorer est Retrofit .

24
zzas11