我运行一个非常简单的REST Web服务,以在后查询中接收字符串参数,对其进行处理并发送回字符串响应。为了解析字符串中的参数

param1=testData1&param2=testData2&


我正在使用String.split()如下:

@POST
@Produces(MediaType.TEXT_PLAIN)
public String post(String str) {
  String[] parts = str.split("&");
  String part1 = parts[0]; // param1=testData1
  String part2 = parts[1]; // param2=testData2
  ......do something on these values and return String....
  return str;
}


为了获取参数值,我将不得不再次拆分.....
有人可以建议一种更干净,更优雅的解决方案来获取这些参数值。

最佳答案

假定其形式参数,对Jersey 1.x或Jersey 2.x均适用的一种方法是注入MultivaluedMap

@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public String post(MultivaluedMap<String, String> form) {
    StringBuilder builder = new StringBuilder();
    for (Map.Entry<String, List<String>> params : form.entrySet()) {
        for (String key: params.getValue()) {
            builder.append("key: ").append(params.getKey()).append("; ")
                .append("value: ").append(params.getValue().get(0)).append("\n");
        }
    }
    return builder.toString();
}


如果您提前知道表单键的名称,则可以创建一个bean。

public class Bean {
    @FormParam("key1")
    private String value1;
    @FormParam("key2")
    private String value2;

    // getter and setters
}


对于Jersey 2.x,您应注入@BeanParam

@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response post(@BeanParam Bean bean) {

}


对于Jersey 1.x,您需要注入@InjectParam

@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response post(@InjectParam Bean bean) {

}


注意,bean注入也将对所有其他@XxxParam起作用,而不仅仅是@FormParam,例如@QueryParam@PathParam。您可以混合搭配它们。

或者,如果您提前知道名称,则不需要bean,您只需在方法签名中声明所有表单参数

@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response post(@FormParam("key1") String value1,
                     @FormParam("key2") String value2) {

}

10-07 19:31
查看更多