REST Web服务(JERSEY)中POST HTTP请求的进程参数

时间:2011-06-25 16:13:16

标签: http google-app-engine jersey httprequest

我正在GAE上开发一个休息网络服务。我正在使用Jersey框架来实现这些服务。这是一个POST服务,我必须传递参数。我尝试使用2种类型的注释,但我无法获取参数:

@Context

@POST
@Path("add")
@Produces( { MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Notification addUser(@Context UriInfo uriInfo){
    MultivaluedMap<String, String> queryParams = uriInfo.getQueryParameters();
    String nickname = queryParams.getFirst("nickname");
    String name = queryParams.getFirst("name");
    String surname = queryParams.getFirst("surname");
    String telephone = queryParams.getFirst("telephone");
    String email = queryParams.getFirst("email");
    User =createUser(nickname, name, surname, telephone, email);

    .......
}

@QueryParam

@POST
@Path("add")
@Produces( { MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Notification addUser(@QueryParam("nickname") String nickname, @QueryParam("name") String name, @QueryParam("surname") String surname, @QueryParam("telephone") String telephone, @QueryParam("email") String email) {
    User =createUser(nickname, name, surname, telephone, email);
    ......
}

但是在这两种情况下我都无法得到所有参数都是空值的参数。

这是我的http请求的一个示例:

Request URL: http://windyser.appspot.com/rest/users/add
Request Method: POST
Params: {"nickname":"prova","name":"danilo","surname":"delizia","email":"prova@yahoo.it","telephone":"123"}
Sent Headers
Accept: */*
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept-Language: en

有人知道我错过了什么吗?

提前感谢您的帮助

Danilo的

1 个答案:

答案 0 :(得分:2)

Jetty 8.x支持Java EE 6,Jetty 7.x仅支持Java EE 5。 我从你的第一个代码片段中看到你使用Java EE 6中的“@Produces”注释。它一定是问题所在。

修复:

  1. 确保使用与Jetty 8.x捆绑在一起的GAE SDK来支持注释 - 或 -
  2. 仅使用Java EE 5工具。

  3. [编辑]

    让服务知道您需要使用String参数。尝试使用@Consumes运行时注释:

    @POST
    @Path("/add")
    @Produces( { MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
    @Consumes("application/x-www-form-urlencoded") // to consume String parameters
    public Notification addUser(@FormParam("nickname") String nickname) {        
        ......
    }
    

    接下来,如果您需要访问该服务:

    URL url = new URL("http://[HOST]:[PORT]/[CONTEXT]/?nickname=prova"); // Your parameter
    HttpURLConnection conn = (HttpURLConnection)url.openConnection();
    conn.setDoOutput(true);
    conn.setDoInput(true);
    conn.setRequestMethod("POST");
    conn.connect();            
    
    // Get the response
    BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String line;
    while ((line = rd.readLine()) != null) {
        System.out.println(line); // Your service's response
    }
    rd.close();
    conn.disconnect()
    

    希望这有帮助。