[JAVA] Développement Android-Accès WEB (POST) Essayez de communiquer avec l'extérieur et d'envoyer des données. ~

introduction

Bonjour. Je suis Wataku, un programmeur côté serveur qui étudie la programmation dans une certaine école. : détendu: Développons également Android cette fois. Cette fois, je voudrais me connecter à un réseau externe avec Android et envoyer des données. C'est presque le même que le dernier GET.

Personne cible

Transmission POST

  1. Préparez une chaîne de caractères qui relie les paramètres de demande à envoyer avec "&".
String postData ="Demander le paramètre 1= ” +Valeur 1+ “ &Requête paramètre 2= ” +Valeur 2
  1. Définissez la méthode de requête sur POST.
con.setRequestMethod(“POST”)
  1. Active la sortie des paramètres de demande.
con.setDoOutput(true)
  1. Obtenez OutputStream. → Connectez le serveur et le tuyau.
OutputStream os = con.getOutputStream()
  1. Envoyer les paramètres de requête → Connectez le serveur et le tube
os.write(postData.getByte())
//Chaîne(String)Les données ne peuvent être envoyées que si elles sont converties en octets

** (Remarque) ** * Con.connect () n'est pas requis pour POST. * Progress Lorsque vous appelez ** publishProgress () ** dans "doInBackground ()" d'AsyucTask, "onProgressUpdate ()" est exécuté dans le thread d'interface utilisateur.

private class PostAccess extends AsyucTask< String, String, String > {   
                             ...
  public String doInBackground(String ... parent) {
                         ...
    publishProgress(Chaîne);
  }

  public void onProgressUpdate(String ... values) {
    super.onProgressUpdate(values);//Écrivez comme une promesse
  }
}

Exemple de code pour POST sur le serveur

public class PostActivity extends AppCompatActivity {

    private static final String ACCESS_URL = "http://xxx.xxx.xx/xx/~~~.php";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_post);
    }

    public void sendButtonClick(View view) {
        EditText etName = findViewById(R.id.etName);
        EditText etComment = findViewById(R.id.etComment);
        TextView tvProcess = findViewById(R.id.tvProcess);
        TextView tvResult = findViewById(R.id.tvResult);

        tvProcess.setText("");
        tvResult.setText("");

        String name = etName.getText().toString();
        String comment = etComment.getText().toString();

        PostAccess access = new PostAccess(tvProcess, tvResult);
        access.execute(ACCESS_URL, name, comment);
    }

    private class PostAccess extends AsyncTask<String, String, String> {
        private static final String DEBUG_TAG = "PostAccess";
        private TextView _tvProcess;
        private TextView _tvResult;
        private boolean _success = false;

        public PostAccess(TextView tvProcess, TextView tvResult) {
            _tvProcess = tvProcess;
            _tvResult = tvResult;
        }

        @Override
        public String doInBackground(String... params) {
            String urlStr = params[0];
            String name = params[1];
            String comment = params[2];

            String postData = "name= " + name + "&comment=" + comment;
            HttpURLConnection con = null;
            InputStream is = null;
            String result = "";

            try {
                publishProgress(getString(R.string.msg_send_before));
                URL url = new URL(urlStr);
                con = (HttpURLConnection) url.openConnection();
                con.setRequestMethod("POST");
                con.setConnectTimeout(5000);
                con.setReadTimeout(5000);
                con.setDoOutput(true);
                OutputStream os = con.getOutputStream();
                os.write(postData.getBytes());
                os.flush();
                os.close();
                int status = con.getResponseCode();
                if (status != 200) {
                    throw new IOException("Code d'état: " + status);
                }
                publishProgress(getString(R.string.msg_send_after));
                is = con.getInputStream();

                result = is2String(is);
                _success = true;
            }
            catch(SocketTimeoutException ex) {
                publishProgress(getString(R.string.msg_err_timeout));
                Log.e(DEBUG_TAG, "temps libre", ex);
            }
            catch(MalformedURLException ex) {
                publishProgress(getString(R.string.msg_err_send));
                Log.e(DEBUG_TAG, "Échec de la conversion d'URL", ex);
            }
            catch(IOException ex) {
                publishProgress(getString(R.string.msg_err_send));
                Log.e(DEBUG_TAG, "Échec de la communication", ex);
            }
            finally {
                if (con != null) {
                    con.disconnect();
                }
                try {
                    if (is != null) {
                        is.close();
                    }
                }
                catch (IOException ex) {
                    publishProgress(getString(R.string.msg_err_parse));
                    Log.e(DEBUG_TAG, "L'analyse InputStream a échoué", ex);
                }
            }
            return result;
        }

        @Override
        public void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
            String message = _tvProcess.getText().toString();
            if (!message.equals("")) {
                message += "\n";
            }
            message += values[0];
            _tvProcess.setText(message);
        }

        @Override
        public void onPostExecute(String result) {
            if (_success) {
                String name = "";
                String comment = "";
                onProgressUpdate(getString(R.string.msg_parse_before));
                try {
                    JSONObject rootJson = new JSONObject(result);
                    name = rootJson.getString("name");
                    comment = rootJson.getString("comment");
                }
                catch (JSONException ex) {
                    onProgressUpdate(getString(R.string.msg_err_parse));
                    Log.e(DEBUG_TAG, "L'analyse JSON a échoué", ex);
                }
                onProgressUpdate(getString(R.string.msg_parse_after));

                String message = getString(R.string.dlg_msg_name) + name + "\n" + getString(R.string.dlg_msg_comment) + comment;
                _tvResult.setText(message);
            }
        }

        private String is2String(InputStream is) throws IOException {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            StringBuffer sb = new StringBuffer();
            char[] b = new char[1024];
            int line;
            while(0 <= (line = reader.read(b))) {
                sb.append(b, 0, line);
            }
            return sb.toString();
        }
    }
}

c'est tout. Si vous avez des suggestions telles que quelque chose qui ne va pas, veuillez nous contacter. Merci d'avoir lu jusqu'au bout.

Recommended Posts

Développement Android-Accès WEB (POST) Essayez de communiquer avec l'extérieur et d'envoyer des données. ~
Développement Android-Accès WEB (GET) Essayez d'obtenir des données en communiquant avec l'extérieur. ~
Revenir au début et démarrer avec Java ① Types de données et modificateurs d'accès
Exécutez logstash avec Docker et essayez de télécharger des données sur Elastic Cloud
Lisez les données de Shizuoka Prefecture Point Cloud DB avec Java et essayez de détecter la hauteur de l'arbre.
Comment modifier le nombre maximum et maximum de données POST dans Spark
Envoyez et traitez les données de formulaire au servlet avec l'objet FormData et le téléchargement de fichier Commons
Application Android: essayez de résumer les événements et les auditeurs
Essayez de résumer la disposition commune avec des rails
NLP4J [005-1] Essayez l'analyse Twitter avec Twitter4J et NLP4J (collecte de données)
Accédez à l'API Web avec Get sur Android et traitez Json (Java pour le moment)
Comment faire une capture d'écran avec l'émulateur Android Studio
[MT] Spécifiez la catégorie d'article d'Android avec l'API de données
Application Android qui sélectionne et affiche des images de la galerie
Créez une API pour envoyer et recevoir des données Json avec Spring
[MT] Spécifiez la catégorie d'article d'Android avec l'API de données
Envoyer la valeur du capteur d'accélération d'Android au PC par UDP
Causes techniques et contre-mesures pour les points auxquels j'étais accro avec la première application Android et Kotlin