web-dev-qa-db-fra.com

Comment ajouter des paramètres à l'API (http post) en utilisant la bibliothèque okhttp dans Android

Dans ma Android, j'utilise la bibliothèque okHttp . Comment envoyer des paramètres au serveur (api) en utilisant la bibliothèque okhttp? Actuellement j'utilise le code suivant pour accéder au serveur, vous devez maintenant utiliser la bibliothèque okhttp.

c'est le mon code:

httpPost = new HttpPost("http://xxx.xxx.xxx.xx/user/login.json");
nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("email".trim(), emailID));
nameValuePairs.add(new BasicNameValuePair("password".trim(), passWord));
httpPost = new HttpPost(url);
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
String response = new DefaultHttpClient().execute(httpPost, new BasicResponseHandler());
35
M.A.Murali

Pour OkHttp 3.x, FormEncodingBuilder a été supprimé, utilisez plutôt FormBody.Builder

        RequestBody formBody = new FormBody.Builder()
                .add("email", "[email protected]")
                .add("tel", "90301171XX")
                .build();

        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(url)
                .post(formBody)
                .build();

        Response response = client.newCall(request).execute();
        return response.body().string();
48
Bao Le
    private final OkHttpClient client = new OkHttpClient();

      public void run() throws Exception {
        RequestBody formBody = new FormEncodingBuilder()
            .add("email", "[email protected]")
            .add("tel", "90301171XX")
            .build();
        Request request = new Request.Builder()
            .url("https://en.wikipedia.org/w/index.php")
            .post(formBody)
            .build();

        Response response = client.newCall(request).execute();
        if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

        System.out.println(response.body().string());
      }
43
Gennady Kozlov

Il vous suffit de formater le corps de POST avant de créer l'objet RequestBody.

Vous pouvez le faire manuellement, mais je vous suggère d'utiliser la bibliothèque MimeCraft de Square (fabricants d'OkHttp).

Dans ce cas, vous auriez besoin de la classe FormEncoding.Builder ; définissez contentType sur "application/x-www-form-urlencoded" et utilisez add(name, value) pour chaque paire clé-valeur.

7
matiash

Aucune des réponses n'a fonctionné pour moi, donc j'ai joué autour et en dessous une a bien fonctionné. Partager juste au cas où quelqu'un se retrouverait avec le même problème:

Importations:

import com.squareup.okhttp.MultipartBuilder;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;

Code:

OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new MultipartBuilder()
        .type(MultipartBuilder.FORM) //this is what I say in my POSTman (Chrome plugin)
        .addFormDataPart("name", "test")
        .addFormDataPart("quality", "240p")
        .build();
Request request = new Request.Builder()
        .url(myUrl)
        .post(requestBody)
        .build();
try {
    Response response = client.newCall(request).execute();
    String responseString = response.body().string();
    response.body().close();
    // do whatever you need to do with responseString
}
catch (Exception e) {
    e.printStackTrace();
}
4
Sufian

Habituellement, pour éviter les exceptions provoquées par le code exécuté dans le thread d'interface utilisateur, exécutez le processus de demande et de réponse dans un thread de travail (tâche Thread ou Asynch) en fonction de la durée prévue du processus.

    private void runInBackround(){

       new Thread(new Runnable() {
            @Override
            public void run() { 
                //method containing process logic.
                makeNetworkRequest(reqUrl);
            }
        }).start();
    }

    private void makeNetworkRequest(String reqUrl) {
       Log.d(TAG, "Booking started: ");
       OkHttpClient httpClient = new OkHttpClient();
       String responseString = "";

       Calendar c = Calendar.getInstance();
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       String booked_at = sdf.format(c.getTime());

         try{
             RequestBody body = new FormBody.Builder()
                .add("place_id", id)
                .add("booked_at", booked_at)
                .add("booked_by", user_name.getText().toString())
                .add("booked_from", lat+"::"+lng)
                .add("phone_number", user_phone.getText().toString())
                .build();

        Request request = new Request.Builder()
                .url(reqUrl)
                .post(body)
                .build();

        Response response = httpClient
                .newCall(request)
                .execute();
        responseString =  response.body().string();
        response.body().close();
        Log.d(TAG, "Booking done: " + responseString);

        // Response node is JSON Object
        JSONObject booked = new JSONObject(responseString);
        final String okNo = booked.getJSONArray("added").getJSONObject(0).getString("response");
        Log.d(TAG, "Booking made response: " + okNo);

        runOnUiThread(new Runnable()
        {
            public void run()
            {
                if("OK" == okNo){
                    //display in short period of time
                    Toast.makeText(getApplicationContext(), "Booking Successful", Toast.LENGTH_LONG).show();
                }else{
                    //display in short period of time
                    Toast.makeText(getApplicationContext(), "Booking Not Successful", Toast.LENGTH_LONG).show();
                }
            }
        });

    } catch (MalformedURLException e) {
        Log.e(TAG, "MalformedURLException: " + e.getMessage());
    } catch (ProtocolException e) {
        Log.e(TAG, "ProtocolException: " + e.getMessage());
    } catch (IOException e) {
        Log.e(TAG, "IOException: " + e.getMessage());
    } catch (Exception e) {
        Log.e(TAG, "Exception: " + e.getMessage());
    }

}

J'espère que cela aide quelqu'un là-bas.

1
orups

Une autre façon (sans MimeCraft), est de faire:

    parameters = "param1=text&param2=" + param2  // for example !
    request = new Request.Builder()
            .url(url + path)
            .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, parameters))
            .build();

et déclarer:

    public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");
1
Christian

Si vous souhaitez envoyer des données de publication via l'API en utilisant OKHTTP 3, veuillez essayer ci-dessous le code simple

MediaType MEDIA_TYPE = MediaType.parse("application/json");
        String url = "https://cakeapi.trinitytuts.com/api/add";

        OkHttpClient client = new OkHttpClient();

        JSONObject postdata = new JSONObject();
        try {
            postdata.put("username", "name");
            postdata.put("password", "12345");
        } catch(JSONException e){
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        RequestBody body = RequestBody.create(MEDIA_TYPE, postdata.toString());

        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .header("Accept", "application/json")
                .header("Content-Type", "application/json")
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                String mMessage = e.getMessage().toString();
                Log.w("failure Response", mMessage);
                //call.cancel();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

                String mMessage = response.body().string();
                Log.e(TAG, mMessage);
            }
        });

Vous pouvez lire le tutoriel complet pour envoyer des données au serveur en utilisant OKHTTP 3 GET et POST demande ici: - https://trinitytuts.com/get-and-post-request- using-okhttp-in-Android-application /

0
Aneh Thakur