#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();
Надеюсь, это может кому-то помочь.