改造 2 多部分 POST 请求向 PHP 发送额外的报价


Retrofit 2 Multipart POST request sends extra quotes to PHP

使用 Retrofit 2.0.1,我在 Android App 中定义的 API 接口中有一个调用函数:

@Multipart
@POST("api.php")
Call<ResponseBody> doAPI(
  @Part("lang") String lang,
  @Part("file'"; filename='"image.jpg") RequestBody file
);

我像这样发送请求:

Call call = service.doAPI("eng", imageFile);

其中imageFile是使用 File 对象创建的RequestBody。上传图像部分没有问题,而@Part("lang") String lang部分在服务器中获得了额外的报价。

在 PHP 端,它写成如下:

$lang = trim($_POST['lang']);

返回"eng" .为什么字符串周围有一个额外的双引号?

当然,我可以去掉尾随和前导双引号,但这样做很奇怪


相关问题: https://github.com/square/retrofit/issues/1210

对于您的问题,请使用文档

标量(基元、盒装和字符串): com.squareup.retrofit2:转换器标量

因此,将compile 'com.squareup.retrofit2:converter-scalars:2.0.1'添加到build.gradle文件中

然后。。。

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(API_URL_BASE)
    .addConverterFactory(ScalarsConverterFactory.create())
    //.addConverterFactory(GsonConverterFactory.create())
    .build();

希望对您有所帮助!

对所有参数使用 RequestBody。请通过下面的代码!!

File file = new File(imagePath);
RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part imageFileBody = MultipartBody.Part.createFormData("media", file.getName(), requestBody);
RequestBody id = RequestBody.create(MediaType.parse("text/plain"),addOfferRequest.getCar_id());
ApiCallback.MyCall<BaseResponse> myCall = apiRequest.editOfferImage(imageFileBody,id);

使用RequestBodyRetrofit而不是字符串

@Multipart
@POST(ApiURL)
ApiCallback.MyCall<BaseResponse> editOfferImage(@Part MultipartBody.Part imageFile,@Part("id") RequestBody id);

如果您不想使用转换器,以下是我发送包含图像文件和 2 个字符串的多部分请求的方法:

@Multipart
@POST("$ID_CHECK_URL/document")
fun postMultipart(@Part imageFile: MultipartBody.Part, @Part string2:  MultipartBody.Part, @Part string2:  MultipartBody.Part)

并这样称呼它:

    val body = RequestBody.create(MediaType.parse("image/jpg"), file)
    val imageFilePart = MultipartBody.Part.createFormData("file", file.name, reqFile)
    val string1Part = MultipartBody.Part.createFormData("something", "string 1")
    val string2Part = MultipartBody.Part.createFormData("somethingelse", "string 2")
    service.postDocument(imageFilePart, string1Part, string2Part)

我今天在我的项目中遇到了这个问题,这就是我解决它的方式。我将字符串和其他基元值的@Part更改为@Query,对于文件(在我的案例图像中),我使用了@Part。 看起来@Query与@Part相比以不同的方式处理字符串。

所以我对原始问题的回答是这样的:

@Multipart
@POST("api.php")
Call<ResponseBody> doAPI(
  @Query("lang") String lang,
  @Part("file'"; filename='"image.jpg") RequestBody file
);

这应该发送没有不需要的引号的字符串值。可悲的是,我无法解释为什么这会起作用,它与@Part数据的编码有关。