jQuery没有为Jersey服务发布URL参数?

时间:2013-05-23 01:03:46

标签: jquery ajax jersey

这看起来很简单,但我无法弄清楚为什么它不起作用。

我定义了泽西服务:

@POST
public SomeObject createSomeObject(
    @QueryParam("firstParam") String firstParam,
    @QueryParam("secondParam") String secondParam)
{
    // Does stuff, returns the object.
}

现在,如果我做一个简单的curl,它可以正常工作:

curl -X POST "http://localhost:8080/path/to/service?firstParam=Bleh&secondParam=Blah

但是,以下结果导致Java中的firstParam和secondParam null

$.ajax({
    url: '/path/to/service',
    type: 'POST',
    data: {
        firstParam: 'Bleh',
        secondParam: 'Blah'
    },
    success: doStuff,
    error: eek
});

这看起来非常直截了当。我觉得他们应该表现得完全一样。我错过了什么?我尝试过的事情(但似乎没有必要):

  • contentType: 'application/x-www-form-urlencoded'添加到ajax来电。
  • @Consumes(MediaType.APPLICATION_FORM_URLENCODED)添加到Jersey服务。
  • 使用JSON.stringify包装数据对象(我知道我需要在contentType: 'json'时执行此操作,但不应该在此处。

我知道我可以自己编写URL参数并将其填入URL中,但这似乎不够优雅,我不应该这样做。

2 个答案:

答案 0 :(得分:0)

如果您使用POST发送多个参数,则需要执行application / x-www-form-urlencoded POST,这样params就会在请求中编码,如:

firstParam=Bleh&secondParam=Blah

但是,要消耗theese params,你必须注释函数params,如:

@POST
public SomeObject createSomeObject(@FormParam("firstParam") String firstParam,
                                   @FormParam("secondParam") String secondParam) {
    // Does stuff, returns the object.
}

注意注释是@FormParam而不是@QueryParam

请注意,如果你执行“普通”POST,你的函数只能有一个参数来接收de POSTed数据(来自查询字符串url params指定的params的appart)

答案 1 :(得分:0)

$.ajax({
        type: "POST",
        contentType: "application/x-www-form-urlencoded;charset=utf-8",
        url: url,
        data: data,
        dataType: 'json',
        timeout: 3000,
        // jsonpCallback:"foo",
        success:function(response){
            console.log(response);              
        },
        error: function(){
            console.log("error!");
        }
    });

上面是一个jquery请求,正如@futuretelematics所说我们需要contentType:“application / x-www-form-urlencoded; charset = utf-8”。 然后在Jersey服务中添加@Consumes({MediaType.APPLICATION_FORM_URLENCODED})。

@POST
@Produces({ MediaType.APPLICATION_JSON})
@Consumes( {MediaType.APPLICATION_FORM_URLENCODED})
public String execute(@FormParam("stoYardName") String data,
                       @FormParam("domTree") String domTree
                                    ) {
            .........

};