使用多部分表单数据无法到达服务器来改进POST请求

时间:2018-10-03 10:21:09

标签: android retrofit2 multipartform-data

我有一个API,我必须在其中发送普通字段和图像。为了调用API,我正在使用Retrofit。为了发送多部分请求,我使用了多部分主体生成器方法。下面是相同的代码。

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错误的网关
  http://18.222.231.171/api/lineheight/5bb45c4485453079ebb14b15(4637ms)
  伺服器:nginx / 1.10.3(Ubuntu)
  日期:2018年10月3日,星期三10:31:23 GMT
  内容类型:text / html
  内容长度:182
  连接:保持活动状态
   502错误的网关
   

502错误的网关


  

PS:-该API在iOS和Postman中均能正常工作

这是电话代码:

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

我与一个Web服务人员确认,当我从应用程序调用此API时,它们在日志中什么也没有,而从Postman调用该API时显示日志。

1 个答案:

答案 0 :(得分:1)

这就是我尝试过的方式

这就是我准备多部分实体的方式。

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注释