web-dev-qa-db-fra.com

Comment publier des données à l'aide de la bibliothèque okhttp avec le type de contenu x-www-form-urlencoded?

J'ai utilisé cette méthode https://stackoverflow.com/a/31744565/5829906 mais ne publie pas de données.

Voici mon code

 OkHttpClient client = new OkHttpClient();
        RequestBody requestBody = new MultipartBuilder()
                .type(MultipartBuilder.FORM)
                .addFormDataPart("rating", "5").addFormDataPart("comment", "Awesome")
                .build();
        Request request = new Request.Builder()
                .url(url)
                .post(requestBody)
                .build();
        try {

            Response response = client.newCall(request).execute();
            String responseString = response.body().string();
            response.body().close();
        }catch (Exception e) {
            e.printStackTrace();
        }

J'ai essayé DefaultHttpClient, qui semble fonctionner, mais cela montre que c'est obsolète, alors j'ai pensé essayer quelque chose de différent..Cant comprendre ce qui ne va pas dans ce

15
MrRobot9

Vous sélectionnez MediaType MultipartBuilder.FORM qui sert à télécharger le fichier/l'image en plusieurs parties

public static final MediaType FORM = MediaType.parse("multipart/form-data");

essayez d'envoyer comme ça

private final OkHttpClient client = new OkHttpClient();
public void run() throws Exception { 
    RequestBody formBody = new FormBody.Builder().add("search", "Jurassic Park").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()); 
}

26
Chayon Ahmed

Pour ceux qui peuvent encore venir ici, utiliser avec Retrofi2 et transmettre correctement vos données au corps de la requête. Même si vous définissez "application/x-www-form-urlencoded" et que vous n'avez pas transmis correctement vos données, vous aurez toujours un problème. C'était ma situstion

OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.addInterceptor(new Interceptor() {
    @Override
    public okhttp3.Response intercept(Chain chain) throws IOException {
        Request original = chain.request();
        Request.Builder requestBuilder = original.newBuilder()
                .addHeader("ContentType", "application/x-www-form-urlencoded");
        Request request = requestBuilder.build();
        return chain.proceed(request);
    }
});
OkHttpClient client = httpClient.build();
Retrofit.Builder builder = new Retrofit.Builder()
        .baseUrl(URL)
        .client(client)
        .addConverterFactory(GsonConverterFactory.create());

Retrofit retrofit = builder.build();
Api api = retrofit.create(Api.class);

Assurez-vous ensuite de transmettre vos données à votre point de terminaison api comme indiqué ci-dessous. PAS comme JSON, ni objet de classe ou chaîne mais comme corps de requête.

RequestBody formBody = new FormBody.Builder()
        .addEncoded("grant_type", "password")
        .addEncoded("username", username)
        .addEncoded("password", password)
        .build();

appelez votre service api

Call<Response> call = api.login(formBody);

J'espère que cela aide quelqu'un

1
Damilinks