Как передать содержимое в RequestBody, когда параметров много?

#java #android #okhttp #okhttp3

#java #Android #okhttp

Вопрос:

Я использую postman для тестирования своих запросов. Итак, я выбрал опцию из postman, которая показывает фрагмент кода и выбран OkHttp , а фрагмент :

 OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");

RequestBody body = RequestBody.create(mediaType, "a=fooamp;b=baramp;c=wowamp;d=awesomeamp;e=randomamp;f=rainbows /** lots of strings **/");
Request request = new Request.Builder()
 .url(URL)
 .post(body)
 .addHeader("content-type", "application/x-www-form-urlencoded")
 .addHeader("cache-control", "no-cache")
 .addHeader("postman-token", "40052d2a-0ff0-ead4-1cf7-1c12f9b8eca9")
 .build();

Response response = client.newCall(request).execute();
  

Содержимое для RequestBody действительно большое. Я попытался создать его с помощью конкатенации строк, и это работает, но что, если я получу строку с пробелами, и кто знает, какие существуют другие крайние случаи, которые могут испортить содержимое.

Итак, есть ли лучший способ, чем конкатенация строк?

Ответ №1:

Я думаю, вы хотите использовать FormBody:

 RequestBody body = new FormBody.Builder()
        .add("imageUrl", imageUri.toString())
        .add("caption", caption)
        .add("foo", "bar")
        .build();
  

Он также добавляет тип содержимого для вас и заботится о кодировании.

Другим вариантом может быть класс Uri, но, поскольку вы уже работаете с okhttp3, в нем нет необходимости.

Комментарии:

1. Если я использую FormBody и передаю его в Request. Builder() запрос, который я делаю, неверен. Я думаю, что не хватает MediaType, потому что выше в фрагменте, который я использую RequestBody.create() перед передачей тела в Request.Builder()

2. Если вы посмотрите на исходный код , вы увидите, что он использует соответствующий тип носителя. Что нового в отношении вашего сниппета, так это то, что FormBody фактически кодирует строку, заботясь о пробелах и других символах, о которых вы беспокоились.

3. спасибо, это спасло мне день

Ответ №2:

если у вас много данных, просто используйте MediaType, например «application / json», а содержимое — это строка Json. Сначала вы создаете JSONObject для размещения данных, затем используете метод toString() для получения строки json, а затем кодируете следующим образом:

 MediaType mediaType = MediaType.parse("application/json");

OkHttpClient okHttpClient = new OkHttpClient();
RequestBody requestBody = RecordBody.create(mediaType, jsonString);
Request request = Request.Builder().url(url).post(requestBody).build();

Response response = okHttpClient.newCall(request).execute();
  

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