Как публиковать данные с помощью библиотеки okhttp с типом контента x-www-form-urlencoded?

Я использовал этот метод https://stackoverflow.com/a/31744565/5829906, но не отправлял данные.

Вот мой код

 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();
        }

Я попробовал DefaultHttpClient , который, кажется, работает, но показывает, что он устарел, поэтому подумал о том, чтобы попробовать что-то другое. Не могу понять, что не так в этом


person MrRobot9    schedule 02.03.2016    source источник


Ответы (2)


Вы выбираете MediaType MultipartBuilder.FORM, который предназначен для загрузки файла/изображения как составного.

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

попробуйте отправить вот так

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()); 
}

person Chayon Ahmed    schedule 27.07.2016
comment
В текущей версии замените FormBody на MultipartBody https://github.com/square/okhttp/wiki/Recipes - person ; 23.05.2018
comment
Мне нужно передать Content-Type:application/x-www-form-urlencoded (заголовок и значение токена) и с телом формы некоторой пары значений ключа, но okhtp всегда дает мне 401 несанкционированную ошибку, как сделать это с okhttp? - person B.shruti; 10.07.2018
comment
401 означает, что вы несанкционированно отправляете неверный токен доступа на сервер, поэтому вы получаете 401 - person Chayon Ahmed; 10.07.2018

Для тех, кто все еще может прийти сюда, используя Retrofi2 и правильно передавая свои данные в тело запроса. Даже если вы установили «application/x-www-form-urlencoded» и не передали свои данные должным образом, проблема все равно будет. Это была моя ситуация

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

Затем убедитесь, что вы передаете свои данные на конечную точку API, как показано ниже. НЕ как JSON, объект класса или строка, а как тело запроса.

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

позвоните в службу API

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

Я надеюсь, что это поможет кому-то

person Damilinks    schedule 13.10.2019
comment
Какая зависимость определяет тип переменной API? Студия Android рекомендует импортировать некоторый класс com.google.gms....., но это не кажется правильным. - person Josh; 28.04.2020
comment
.addEncoded(key, value) сделал это за меня. Использование только OkHTTP - person bastiotutuama; 04.09.2020