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

发布于 2022-09-05 04:04:55 字数 2723 浏览 33 评论 0

这是我的Activity

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Observable<Object> a = fileRetrofit().create(ApiStores.class).addCase2("123", 1234);
        a.subscribeOn(Schedulers.io()).subscribe(new Consumer<Object>() {
            @Override
            public void accept(Object o) throws Exception {

            }
        });
    }

    public static Retrofit mFileRetrofit;

    public static Retrofit fileRetrofit(){
        if (mFileRetrofit == null) {
            OkHttpClient.Builder builder = new OkHttpClient.Builder()
                    .addInterceptor(new LoggingInterceptor());
            OkHttpClient okHttpClient = builder.build();

            mFileRetrofit = new Retrofit.Builder()
                    .baseUrl(ApiStores.BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .client(okHttpClient)
                    .build();
        }
        return mFileRetrofit;
    }
}

这是接口

public interface ApiStores {
    //baseUrl
    String BASE_URL = "http://123.12.123.123/";

    @Multipart
    @POST("qwe/asd")
    Observable<Object> addCase2(@Part("tag") String tag, @Part("tag2") int tag2);
}

一下是LOG”
request

                                    
                                    Sending request http://123.12.123.123/qwe/asd on null
                                    
                                    --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”的长度,两边的双引号也被发送过去了

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

独﹏钓一江月 2022-09-12 04:04:55

“@Part(“data”) String des”在Post请求中默认的Content-Type类型是“application/json”,这就说明我们在接口中不能再使用@Part注解了

@Multipart
@POST("userPhoto")
Observable<BaseHttpResult<String>> uploadMultipleTypeFile(@PartMap Map<String, RequestBody> params);

Map<String, RequestBody> bodyMap = new HashMap<>();
bodyMap.put("photo"; filename=""+file.getName(), RequestBody.create(MediaType.parse("image/png"),file));
bodyMap.put("userId", toRequestBody(userId));
bodyMap.put("serialNumber", toRequestBody(serialNumber));

public static RequestBody toRequestBody(String value) {

    RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain"), value);
    return requestBody;

}

鹿! 2022-09-12 04:04:55

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

念﹏祤嫣 2022-09-12 04:04:55

被采纳的答案真是乱指挥,你的代码啥也不用改。

原因是你注册了 GsonConverter,没注册标准类型数据的转换器,导致String这些都会转成 JSON 传输,你只需要加一个标准类型的转换器就行了。

implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
.addConverterFactory(ScalarsConverterFactory.create())
誰ツ都不明白 2022-09-12 04:04:55

bodyMap.put("photo";filename=""+file.getName(),

     RequestBody.create(MediaType.parse("image/png"),file))
 这里的 "photo";filename=""+file.getName() 怎么理解
十二 2022-09-12 04:04:55

.addConverterFactory(ScalarsConverterFactory.create())这个顺序要在 .addConverterFactory(GsonConverterFactory.create())
之前,否则也会解析成json

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文