如何在RESTfulPOST方法中访问参数?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (9)

我的POST方法如下所示:

@POST
@Consumes({"application/json"})
@Path("create/")
public void create(String param1, String param2){
    System.out.println("param1 = " + param1);
    System.out.println("param2 = " + param2);
}

在NetBeans中创建泽西客户机时,调用POST方法的方法如下所示:

public void create(Object requestEntity){
    webResource.path("create").type(MediaType.APPLICATION_JSON).post(requestEntity);
}

运行此测试时:

@Test
public void hello(){
    String json = "{param1=\"hello\",param2=\"hello2\"}";
    this.client.create(json);
}

它在服务器中提供以下输出:

INFO: param1 = {param1="hello",param2="hello2"}
INFO: param2 = 

我需要更改什么才能使参数给出正确的值?

提问于
用户回答回答于

你的@POST方法应该接受JSON对象而不是字符串。泽西使用JAXB支持封送和解封送处理JSON对象(请参阅球衣的细节)。创建一个类,如:

@XmlRootElement
public class MyJaxBean {
    @XmlElement public String param1;
    @XmlElement public String param2;
}

那你的@POST方法如下所示:

@POST @Consumes("application/json")
@Path("/create")
public void create(final MyJaxBean input) {
    System.out.println("param1 = " + input.param1);
    System.out.println("param2 = " + input.param2);
}

此方法期望接收JSON对象作为HTTPPOST的主体。Jax-RS将HTTP消息的内容主体作为未注释的参数传递--input在这种情况下。实际的信息应该类似于:

POST /create HTTP/1.1
Content-Type: application/json
Content-Length: 35
Host: www.example.com

{"param1":"hello","param2":"world"}

HTML<FORM>

参数将使用@FormParam:

@POST
@Path("/create")
public void create(@FormParam("param1") String param1,
                   @FormParam("param2") String param2) {
    ...
}

浏览器将使用“应用程序/x-www-表单-urlencode”

POST /create HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
Content-Length: 25

param1=hello&param2=world

可以执行以下操作:

@POST @Consumes("application/x-www-form-urlencoded")
@Path("/create")
public void create(final MultivaluedMap<String, String> formParams) {
    ...
}

http header

@POST
@Path("/create")
public void create(@HeaderParam("param1") String param1,
                   @HeaderParam("param2") String param2) {
    ...
}

下面是HTTP消息的样子。

POST /create HTTP/1.1
Content-Length: 0
Host: www.example.com
param1: hello
param2: world

我不会用这个方法来传递广义参数。但是,如果需要访问特定HTTP报头的值。

http查询参数

此方法主要用于HTTPGET,但同样适用于POST。它使用@QueryParam注释

@POST
@Path("/create")
public void create(@QueryParam("param1") String param1,
                   @QueryParam("param2") String param2) {
    ...
}

与前面的技术一样,通过查询字符串传递参数不需要消息体。下面是HTTP消息:

POST /create?param1=hello&param2=world HTTP/1.1
Content-Length: 0
Host: www.example.com

http路径参数

@POST
@Path("/create/{param1}/{param2}")
public void create(@PathParam("param1") String param1,
                   @PathParam("param2") String param2) {
    ...
}

该消息与查询参数版本类似,只是消息中没有包含参数的名称。

POST /create/hello/world HTTP/1.1
Content-Length: 0
Host: www.example.com

扫码关注云+社区