Skip to main content
Version: 1.4.x

HTTP Body

POSTPUT等请求方法中,通常使用 HTTP 请求体进行传输数据。在 Forest 中有多种方式设置请求体数据。

data 属性#

您可以通过@Request注解的data属性把数据添加到请求体。需要注意的是只有当typePOSTPUTPATCH这类 HTTP Method 时,data属性中的值才会绑定到请求体中,而GET请求在有些情况会绑定到url的参数中。

具体type属性和data属性数据绑定位置的具体关系如下表:

typedata属性数据绑定位置支持的contentTypeContent-Type请求头
GETurl参数部分只有application/x-www-form-urlencoded
POST请求体任何contentType
PUT请求体任何contentType
PATCH请求体任何contentType
HEADurl参数部分只有application/x-www-form-urlencoded
OPTIONSurl参数部分只有application/x-www-form-urlencoded
DELETEurl参数部分只有application/x-www-form-urlencoded
TRACEurl参数部分只有application/x-www-form-urlencoded

data属性在POST请求中绑定请求体

public interface MyClient {
    @Request(            url = "http://localhost:8080/hello/user",            type = "post",            data = "username=foo&password=bar",            headers = {"Accept:text/plain"}    )    String dataPost();}

该接口调用后所实际产生的 HTTP 请求如下:

POST http://localhost:8080/hello/userHEADER:    Accept:text/plainBODY:    username=foo&password=bar

data属性中进行数据绑定:

public interface MyClient {
    /**     * 这里 data 属性中设置的字符串内容会绑定到请求体中     * 其中 ${0} 和 ${1} 为参数序号绑定,会将序号对应的参数绑定到字符串中对应的位置     * ${0} 会替换为 username 的值,${1} 会替换为 password 的值     */    @Request(            url = "http://localhost:8080/hello/user",            type = "post",            data = "username=${0}&password=${1}",            headers = {"Accept:text/plain"}    )    String dataPost(String username, String password);}
提示

其中${数字}的语法用到了《参数序号引用

如果调用方代码如下所示:

myClient.dataPost("foo", "bar");

实际产生的 HTTP 请求如下:

POST http://localhost:8080/hello/userHEADER:    Accept: text/plainBODY:    username=foo&password=bar

您可以直接把 JSON 数据加入到请求体中,其中header设置为Content-Type: application/json

public interface MyClient {
    @Request(            url = "http://localhost:8080/hello/user",            type = "post",            data = "{\"username\": \"${0}\", \"password\": \"${1}\"}",            headers = {"Content-Type: application/json"}    )    String postJson(String username, String password);}

如果调用方代码如下所示:

myClient.postJson("foo", "bar");

实际产生的 HTTP 请求如下:

POST http://localhost:8080/hello/userHEADER:    Content-Type: application/jsonBODY:    {"username": "foo", "password": "bar"}

把 XML 数据加入到请求体中,其中header设置为Content-Type: application/json

public interface MyClient {
    @Request(            url = "http://localhost:8080/hello/user",            type = "post",            data = "<misc><username>${0}</username><password>${1}</password></misc>",            headers = {"Content-Type: application/xml"}    )    String postXml(String username, String password);}

如果调用方代码如下所示:

myClient.postXml("foo", "bar");

实际产生的 HTTP 请求如下:

POST http://localhost:8080/hello/userHEADER:    Content-Type: application/xmlBODY:    <misc><username>foo</username><password>bar</password></misc>    

@Body 注解#

使用data属性太麻烦?绑定到URL还是Body搞不清楚?那您可以使用@Body注解修饰参数的方式,将传入参数的数据绑定到 HTTP 请求体中。

@Body注解修饰的参数一定会绑定到请求体中,不用担心它会出现在其他地方

/** * 默认body格式为 application/x-www-form-urlencoded,即以表单形式序列化数据 */@Post(    url = "http://localhost:8080/user",    headers = {"Accept:text/plain"})String sendPost(@Body("username") String username,  @Body("password") String password);

JSON格式#

要让@Body绑定的对象转换成JSON格式也非常简单,只要将contentType属性或Content-Type请求头指定为application/json便可。

@Request(    url = "http://localhost:8080/hello/user",    contentType = "application/json",     type = "post")String send(@Body User user);

调用后产生的结果如下:

POST http://localhost:8080/hello/userHEADER:    Content-Type: application/jsonBODY:    {"username": "foo", "password": "bar"}

XML格式#

@Body较为特殊,除了指定contentType属性或Content-Type请求头为application/xml外,还需要设置@Bodyfilter属性为xml

@Post(    url = "http://localhost:8080/hello/user",    contentType = "application/xml")String send(@Body(filter = "xml") User user);

此外,这里的User对象也要绑定JAXB注解:

@XmlRootElement(name = "misc")public User {
    private String usrname;
    private String password;
    public String getUsername() {        return username;    }
    public void setUsername(String username) {        this.username = username;    }
    public String getPassword() {        return password;    }
    public void setPassword(String password) {        this.password = password;    }}

调用传入User对象后的结果如下:

POST http://localhost:8080/hello/userHEADER:    Content-Type: application/xmlBODY:    <misc><username>foo</username><password>bar</password></misc>