Отправка логического параметра с другими параметрами (где один из них является файлом) не удалась

Сервер принимает все параметры, кроме логического с данными запроса составной формы

Итак, у меня есть такой запрос:

@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()

вы пробовали тот же API в почтальоне.. если он работает, пожалуйста, проверьте код в почтальоне, так как он предоставляет эту функциональность, и добавьте SS кода из почтальона

jayesh gurudayalani 31.03.2023 10:49

@jayeshgurudayalani да, на самом деле это проблема сервера, который принимает только 1/0, когда тип контента - данные формы

user924 31.03.2023 11:47
0
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решено. Это проблема с сервером PHP:

он принимает 1/0 только для данных формы, бэкенд-разработчик также должен анализировать true/false

Другие вопросы по теме