Retrofit 2 Multipart POST 请求将额外的引号发送到 PHP
Retrofit 2 Multipart POST request sends extra quotes to PHP
使用Retrofit 2.0.1,我的API接口中有调用函数定义在Android App:
@Multipart
@POST("api.php")
Call<ResponseBody> doAPI(
@Part("lang") String lang,
@Part("file\"; filename=\"image.jpg") RequestBody file
);
我这样发送请求:
呼叫呼叫= service.doAPI("eng", imageFile);
其中 imageFile
是使用 File
对象创建的 RequestBody
。上传图片部分没有问题,而 @Part("lang") String lang
部分在服务器中得到了额外的引号。
在PHP这边,是这样写的:
$lang = trim($_POST['lang']);
哪个returns"eng"
。为什么在字符串两边多了一个双引号?
当然我可以去除尾随和前导双引号,但这样做很奇怪
对于您的问题,请作为文档使用
Scalars (primitives, boxed, and String):
com.squareup.retrofit2:converter-scalars
因此,将 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);
使用 Retrofit
的 RequestBody
class 而不是 String
@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。与 @Part 相比,@Query 似乎以不同的方式处理字符串。
所以我对原始问题的回答是这样的:
@Multipart
@POST("api.php")
Call<ResponseBody> doAPI(
@Query("lang") String lang,
@Part("file\"; filename=\"image.jpg") RequestBody file
);
这应该发送没有不需要的引号的字符串值。
可悲的是,我无法解释为什么会这样,它与数据的@Part 编码有关。
使用Retrofit 2.0.1,我的API接口中有调用函数定义在Android App:
@Multipart
@POST("api.php")
Call<ResponseBody> doAPI(
@Part("lang") String lang,
@Part("file\"; filename=\"image.jpg") RequestBody file
);
我这样发送请求:
呼叫呼叫= service.doAPI("eng", imageFile);
其中 imageFile
是使用 File
对象创建的 RequestBody
。上传图片部分没有问题,而 @Part("lang") String lang
部分在服务器中得到了额外的引号。
在PHP这边,是这样写的:
$lang = trim($_POST['lang']);
哪个returns"eng"
。为什么在字符串两边多了一个双引号?
当然我可以去除尾随和前导双引号,但这样做很奇怪
对于您的问题,请作为文档使用
Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars
因此,将 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);
使用 Retrofit
的 RequestBody
class 而不是 String
@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。与 @Part 相比,@Query 似乎以不同的方式处理字符串。
所以我对原始问题的回答是这样的:
@Multipart
@POST("api.php")
Call<ResponseBody> doAPI(
@Query("lang") String lang,
@Part("file\"; filename=\"image.jpg") RequestBody file
);
这应该发送没有不需要的引号的字符串值。 可悲的是,我无法解释为什么会这样,它与数据的@Part 编码有关。