Модифицированный POST-запрос с данными составной формы, не доходящими до сервера - PullRequest
0 голосов
/ 03 октября 2018

У меня есть API, в котором я должен отправлять нормальные поля вместе с изображениями.Для вызова API я использую Retrofit.Для отправки составного запроса я использую метод Multipart Body Builder.Ниже приведен код для того же.

val builder = MultipartBody.Builder()
builder.setType(MultipartBody.FORM)
var jsonArray = JSONArray()
for ((index, value) in lineItems.withIndex()) {
    var jsonObject = JSONObject()

    jsonObject.accumulate("Room_id", lineItems[index].roomId)
    jsonObject.accumulate("jobTitle", lineItems[index].jobTitle)
    jsonObject.accumulate("floorLevel", lineItems[index].floorLevel)
    jsonObject.accumulate("jobTrade", lineItems[index].jobArea)
    jsonObject.accumulate("jobWork", lineItems[index].jobWork)
    jsonObject.accumulate("desc", lineItems[index].desc)
    jsonObject.accumulate("isFixed", lineItems[index].isFixed)
    jsonObject.accumulate("hourlyCost", lineItems[index].cost)
    jsonObject.accumulate("hourlyTotal", lineItems[index].total)
    jsonObject.accumulate("hourlyDuration", lineItems[index].duration)
    jsonObject.accumulate("fixedCost", lineItems[index].fixedCost)
    if (lineItems[index].lineItemId!="") {
        jsonObject.accumulate("_id", lineItems[index].lineItemId)
    }
    jsonArray.put(jsonObject)
    Log.d("json array",jsonArray.toString())

}

builder.addFormDataPart("lineHeight", jsonArray.toString())
for ((i, value) in lineItems.withIndex()) {
    var imageList = ArrayList<String>()

    if (lineItems[i].imageList!=null && lineItems[i].imageList!!.size>0) {
        imageList = lineItems[i].imageList!!

        for ((j, path) in imageList.withIndex()) {
            if (!imageList[j].contains("http")) {
                val file = File(path)
                val requestFile = 
                    RequestBody.create(MediaType.parse("image/"+
                    file.name.substring(file.name.indexOf(".")+1)), file)
                val body = MultipartBody.Part.createFormData("photos" + i,
                    file.name, requestFile)
                builder.addPart(body)
            }
        }
    }
 }

val requestBody = builder.build()

Когда я вызываю вышеуказанный API, я получаю:

502 Bad Gateway
http://18.222.231.171/api/lineheight/5bb45c4485453079ebb14b15 (4637 мс)
Сервер: nginx / 1.10.3 (Ubuntu)
Дата: среда, 03 октября 2018 10:31:23 GMT
Тип содержимого: текст / html
Длина содержимого: 182
Соединение: keep-alive
502 Bad Gateway

502 Bad Gateway



nginx / 1.10.3 (Ubuntu)

PS: - API прекрасно работает в iOS, а также в Postman

Вот код вызова:

fun addLineItems(@Header("Authorization") token: String,
                 @Path("jobId") jobId: String,
                 @Body body: okhttp3.RequestBody): Call<Response>

Я подтвердил парню веб-служб, что они ничего не получают в логахкогда я вызываю этот API из приложения, в то время как логи отображаются, когда он вызывается из Почтальона.

1 Ответ

0 голосов
/ 03 октября 2018

Вот как я пытался

Вот как я подготовил составную сущность.

File file = new File(currentFilePath);
if (file.exists()) {
String name = URLConnection.guessContentTypeFromName(file.getName());
RequestBody requestFile = RequestBody.create(MediaType.parse(name), file);
MultipartBody.Part multipart = MultipartBody.Part.createFormData("file", file.getName(), requestFile);
}

это способ загрузки файла

@Multipart
@POST("your url")
fun uploadFile(@Header("Authorization") token: String, @Path("jobId") jobId: String,
                @Part file: MultipartBody.Part): Call<Response>

Возможно, выследует добавить @Multipart annotayion к вашему методу

...