1. 程式人生 > >Retrofit上傳頭像並給該請求body新增引數---500 Internal Server Error

Retrofit上傳頭像並給該請求body新增引數---500 Internal Server Error

網路框架用的是retrofit,在引數配置方面,的確是行雲流水,屢試不爽······前提你很熟悉啊。
上傳頭像給後臺:
正常情況下(POST請求)

//接口裡正常定義
    @Multipart
    @POST("user/uploadAvatar")
    Observable<DataString> uploadAvatar(@Part MultipartBody.Part photo);
 //請求方法
    public Observable<DataString> uploadAvatar(File file){
        //設定Content-Type:application/octet-stream
        RequestBody photoRequestBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);

        //設定Content-Disposition:form-data; name="photo"; filename="demo.png"
        MultipartBody.Part photo = MultipartBody.Part.createFormData("file", file.getName(), photoRequestBody);

        return service.uploadAvatar(photo);
    }

其中,MediaType.parse("application/octet-stream")上傳型別根據後臺定製-----如果你有後臺配合的話。
像我現在,人家後臺介面一扔過來說了句,之前在網頁端都除錯過,如果不通,就看看之前h5是怎麼接入的······
現在的需求,除了上傳檔案外,還要攜帶引數:
網上上傳的方法,試了七七八八,光一個Observable<DataString> uploadAvatar(@PartMap Map<String, RequestBody> parm);都反覆試了大半個小時–最後還是抱著試試的態度,介面處:

      @Multipart
      @POST("user/uploadAvatar")
      Observable<DataString> uploadAvatar(@Part("userNo") RequestBody userNo, @Part MultipartBody.Part file);

這裡如果你用@Query("userNo")String userNo該引數會直接新增到url路徑中,並不在body裡。引數型別直接用RequestBody
請求方法處:

 public Observable<BaseBean> uploadAvatar(File files,String useRNo){
        RequestBody userNo = GsonUtils.toRequestBody(useRNo);
        RequestBody photoRequestBody =  RequestBody.create(MediaType.parse("image/png"), files);
        MultipartBody.Part part = MultipartBody.Part.createFormData("file", files.getName(), photoRequestBody);
        return service.uploadAvatar(userNo,part);
    }
//其中的GsonUtils.toRequestBody(useRNo)
   /*
    * 轉換成RequestBody
    * */
    public static RequestBody toRequestBody(String object) {
        RequestBody requestBody = RequestBody.create(null, object);
        return requestBody;
    }

上面的RequestBody.create(null, object)這裡的null,意思是說不給該引數設定型別,正常情況下可以設定為text/plain什麼的。到此,介面除錯,測試通過