猿问

请问为什么Retrofit以Mutipart上传参数时,String参数会多一对双引号

这是我的Activity
publicclassMainActivityextendsAppCompatActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Observablea=fileRetrofit().create(ApiStores.class).addCase2("123",1234);
a.subscribeOn(Schedulers.io()).subscribe(newConsumer(){
@Override
publicvoidaccept(Objecto)throwsException{
}
});
}
publicstaticRetrofitmFileRetrofit;
publicstaticRetrofitfileRetrofit(){
if(mFileRetrofit==null){
OkHttpClient.Builderbuilder=newOkHttpClient.Builder()
.addInterceptor(newLoggingInterceptor());
OkHttpClientokHttpClient=builder.build();
mFileRetrofit=newRetrofit.Builder()
.baseUrl(ApiStores.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(okHttpClient)
.build();
}
returnmFileRetrofit;
}
}
这是接口
publicinterfaceApiStores{
//baseUrl
StringBASE_URL="http://123.12.123.123/";
@Multipart
@POST("qwe/asd")
ObservableaddCase2(@Part("tag")Stringtag,@Part("tag2")inttag2);
}
一下是LOG”request
Sendingrequesthttp://123.12.123.123/qwe/asdonnull
--369f49f5-597d-4aa2-9c5e-86eccda84c88
Content-Disposition:form-data;name="tag"
Content-Transfer-Encoding:binary
Content-Type:application/json;charset=UTF-8
Content-Length:5
"123"
--369f49f5-597d-4aa2-9c5e-86eccda84c88
Content-Disposition:form-data;name="tag2"
Content-Transfer-Encoding:binary
Content-Type:application/json;charset=UTF-8
Content-Length:4
1234
--369f49f5-597d-4aa2-9c5e-86eccda84c88--
可以看到content-length为5,即为“123”的长度,两边的双引号也被发送过去了

		
鸿蒙传说
浏览 953回答 2
2回答

炎炎设计

“@Part(“data”)Stringdes”在Post请求中默认的Content-Type类型是“application/json”,这就说明我们在接口中不能再使用@Part注解了@Multipart@POST("userPhoto")ObservableuploadMultipleTypeFile(@PartMapMapparams);MapbodyMap=newHashMap();bodyMap.put("photo";filename=""+file.getName(),RequestBody.create(MediaType.parse("image/png"),file));bodyMap.put("userId",toRequestBody(userId));bodyMap.put("serialNumber",toRequestBody(serialNumber));publicstaticRequestBodytoRequestBody(Stringvalue){RequestBodyrequestBody=RequestBody.create(MediaType.parse("text/plain"),value);returnrequestBody;}

凤凰求蛊

造成的主要原因有两个:1、retrofit并不内置String的Converter,只有在Url、Header、普通表单字段相关的注解才会默认处理成String。2、你注册了GsonConverter,而GsonConverter是不会判断能不能处理该类型的,全部转成json,而String在json里就是"String"的形式,所以长度变成5,Content-Type头是application/json;charset=UTF-8
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答