Сервер принимает все параметры, кроме логического с данными запроса составной формы
Итак, у меня есть такой запрос:
@Multipart
@POST("auth/...")
suspend fun sendExampleRequest(
@Part("enabled") enabled: Boolean,
@Part("name") name: String,
@Part photo: MultipartBody.Part
)
Позвоните из:
override suspend fun sendExampleRequest(
enabled: Boolean,
name: String,
photo : Uri
) {
try {
withContext(ioDispatcher) {
authApi.sendExampleRequest(
enabled = enabled,
name = name,
photo = document.toMultipartBodyPart(context, "photo")
)
}
} catch (e: Throwable) {
// ...
}
}
Но сервер отвечает ошибкой только для логического параметра, что он имеет неправильное значение.
ЗАПРОС:
--> POST https://...
Content-Type: multipart/form-data; boundary=240f3a38-2e91-4b6c-acd0-c04ba8c0e81a
Content-Length: 68700
accept: application/json
Authorization: Bearer ...
--240f3a38-2e91-4b6c-acd0-c04ba8c0e81a
Content-Disposition: form-data; name = "enabled"
Content-Transfer-Encoding: binary
Content-Type: text/plain; charset=UTF-8
Content-Length: 4
true
--240f3a38-2e91-4b6c-acd0-c04ba8c0e81a
Content-Disposition: form-data; name = "name"
Content-Transfer-Encoding: binary
Content-Type: text/plain; charset=UTF-8
Content-Length: 4
test
--240f3a38-2e91-4b6c-acd0-c04ba8c0e81a
Content-Disposition: form-data; name = "document"; filename = "test_photo_file.jpg"
Content-Type: image/jpeg
Content-Length: 67794
...
ОТВЕТ:
<-- 422 https://... (328ms)
server: nginx
date: Thu, 30 Mar 2023 16:49:08 GMT
content-type: application/json
cache-control: no-cache, private
x-ratelimit-limit: 60
x-ratelimit-remaining: 58
access-control-allow-origin: *
{"message":"The enabled field must be true or false.","errors":{"enabled":["The enabled field must be true or false."]}}
<-- END HTTP (149-byte body)
Вместо этого я могу просто отправить тело JSON, но без файла:
{
"enabled": false,
"name": "test"
}
тогда он не выдает ошибку для логического параметра, но, конечно, выдает ошибку о файле документа, поэтому я могу использовать только составную форму для отправки всех необходимых параметров, но есть некоторая проблема с логическими параметрами
Настройка дооснащения:
@Provides
@Singleton
fun provideRetrofit(
gson: Gson,
client: OkHttpClient,
queryConverterFactory: Converter.Factory
): Retrofit = Retrofit.Builder()
.baseUrl(BuildConfig.BASE_URL)
.client(client)
.addConverterFactory(queryConverterFactory)
.addConverterFactory(ScalarsConverterFactory.create()) // added it but didn't help
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
@jayeshgurudayalani да, на самом деле это проблема сервера, который принимает только 1/0, когда тип контента - данные формы
Решено. Это проблема с сервером PHP:
он принимает 1
/0
только для данных формы, бэкенд-разработчик также должен анализировать true
/false
вы пробовали тот же API в почтальоне.. если он работает, пожалуйста, проверьте код в почтальоне, так как он предоставляет эту функциональность, и добавьте SS кода из почтальона