2 votes

Android JSON POST avec OKHTTP

Je cherche une solution pour mettre en œuvre une requête JSON-POST avec OKHTTP. J'ai un fichier HTTP-Client.java qui gère toutes les méthodes (POST, GET, PUT, DELETE) et dans l'activité RegisterActivity, je voudrais envoyer au serveur les données de l'utilisateur (provenant des champs de saisie) au format JSON.

C'est mon HTTP-Client.java

    public class HttpClient{

        public static final MediaType JSON
                = MediaType.parse("application/json; charset=utf-8");

        public static OkHttpClient client = new OkHttpClient.Builder()
                .cookieJar(new CookieJar() {
                    private final HashMap<String, List<Cookie>> cookieStore = new HashMap<>();

                    @Override
                    public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
                        cookieStore.put(url.host(), cookies);
                    }

                    @Override
                    public List<Cookie> loadForRequest(HttpUrl url) {
                        List<Cookie> cookies = cookieStore.get(url.host());
                        return cookies != null ? cookies : new ArrayList<Cookie>();
                    }
                })
                .build();

        public static Call post(String url, String json, Callback callback) throws IOException {
            RequestBody body = RequestBody.create(JSON, json);

            Request request = new Request.Builder()
                    .url(url)
                    .post(body.create(JSON, json))
                    .build();
            Call call = client.newCall(request);
            call.enqueue(callback);
            return call;
        }
}

... et voici la partie onClick de l'application Enregistrer une activité

btnRegRegister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //TODO

                String registerData = "{\"email\":\"" + etRegisterEmail.getText().toString() + "\",\"password\":\"" + etRegisterPasswort.getText().toString() + "\"}";

                try {
                    HttpClient.post(ABSOLUTE_URL, registerData, new Callback(){
                        @Override
                        public void onFailure(Call call, IOException e) {

                        }
                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            if (response.isSuccessful()) {
                                String resp = response.body().string();
                                if (resp != null) {
                                    Log.d("Statuscode", String.valueOf(response.code()));
                                    Log.d("Body", response.body().string());
                                }
                            }
                        }
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

Chaque fois que je lance l'application, elle se bloque lorsque je clique sur le bouton d'enregistrement, en raison d'une EXPECTION FATALE 'Android.os.NetworkOnMainThreadException'.

J'ai déjà lu quelque chose sur l'AsyncTask mais je ne sais pas exactement comment faire.

4voto

Chayon Ahmed Points 428

Essayez mon code ci-dessous

  MediaType JSON = MediaType.parse("application/json; charset=utf-8");
        Map<String, String> params = new HashMap<String, String>();
        params.put("msisdn", "123123");
       params.put("name", "your name");
        JSONObject parameter = new JSONObject(param);
        OkHttpClient client = new OkHttpClient();

        RequestBody body = RequestBody.create(JSON, parameter.toString());
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .addHeader("content-type", "application/json; charset=utf-8")
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("response", call.request().body().toString());

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                  Log.e("response", response.body().string());
            }

    });

0voto

josemgu91 Points 664

C'est parce que vous essayez d'exécuter la requête HTTP sur le thread principal (ou thread de l'interface utilisateur). Vous ne devriez pas effectuer une tâche longue sur le thread principal car votre application se bloquera, car les routines de dessin sont exécutées dans ce thread (d'où son autre nom "UI Thread"). Vous devez utiliser un autre thread pour effectuer votre requête. Par exemple :

new Thread(){
       //Call your post method here. 
    }.start();

L'asynctask d'Android est une classe simple pour faire du travail asynchrone. Elle exécute d'abord sa méthode "onPreExecute" sur le thread appelant, puis sa méthode "doInBackground" sur un thread d'arrière-plan, puis sa méthode "onPostExecute" de retour dans le thread appelant.

0voto

Rahul Deep Singh Points 104

Essayez d'utiliser Rétrofit bibliothèque pour faire Poste au serveur. Cela permet d'établir une connexion rapide et fiable avec le serveur.
Vous pouvez également utiliser Volley-ball bibliothèque pour la même chose.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X