将普通的 Java Bean 转换为 Retrofit Form 的转换器。
-
构建
Retrofit
对象时,添加对应的转换器。new Retrofit.Builder() .client(okHttpClient) .addConverterFactory(FormBodyConverterFactory.create()) .baseUrl("...") .build();
-
定义一个请求对象类作为请求参数的接收者,并给其添加上
@AsFormBody
的注解,如:@AsFormBody public class TestRequest { @SerializedName("serialized_key1") private String key1; private String key2; //... }
-
定义 api service,POST 请求接收的入参为对应请求对象,如
@Body TestRequest
:public interface TestApi { @POST("test/post") Call<ResponseBody> testPost(@Body TestRequest request); }
-
发起请求,所有请求对象上的参数值【
toString()
方法的值】都会被当做表单项提交到服务器。public void test() { TestRequest req = new TestRequest(); req.setKey1("value1"); req.setKey2("value2"); // ... Call<ResponseBody> call = testAPi.testPost(req); // ... }
提交的数据:
--> POST https://m.baidu.com/test/post Content-Type: application/x-www-form-urlencoded Content-Length: 41 serialized_key1=value1&key2=value2 --> END POST (168-byte body)
-
对于请求对象中的成员变量,如果未加
@SerializedName
的注解,则其变量名将会作为表单的key
被提交到服务器。针对可能存在的代码混淆的情况,建议所有成员都加上该注解,否则可能出现a=value1
的情况。 -
针对不需要将 Java Bean 中的静态字段作为请求入参的场景,请给
@AsFromBody
注解添加对应属性:@AsFormBody(ignoreStaticFields = true) // 该属性默认为 true
-
如果请求对象 A 中内嵌了一个成员 B,想把 B 对象中的所有成员也作为表单项提交到服务器,则需要给 B 成员添加
@FlatMembers
注解:public class A { private String keyA1; @FlatMembers private B b; // ... } public class B { private String keyB1; @SerializedName("SerializedName_Key_B2") private boolean keyB2; }
最终所有的入参都会被提交到服务器。
--> POST https://m.baidu.com/test/post Content-Type: application/x-www-form-urlencoded Content-Length: 83 keyA1=valueA1&keyB1=valueB1&SerializedName_Key_B2=valueB2 --> END POST (168-byte body)