Java GrizzlyHttpServerFactory.createHttpServer@GET带参数

Java GrizzlyHttpServerFactory.createHttpServer@GET带参数,java,web-services,rest,jersey,grizzly,Java,Web Services,Rest,Jersey,Grizzly,我创建了一个简单的GrizzlyHttpServerFactory.createHttpServer服务,并试图发出@GET操作,在该操作中,客户端将传入参数,但我收到一个错误: 我仔细阅读了几个例子,一切看起来都很好。只要我不尝试传递参数,一切都能正常工作。这是我目前掌握的代码 大体上 在资源类中: @Path("TestServer") public class TestServerResource { public static final String CLICHED_MESS

我创建了一个简单的GrizzlyHttpServerFactory.createHttpServer服务,并试图发出@GET操作,在该操作中,客户端将传入参数,但我收到一个错误:

我仔细阅读了几个例子,一切看起来都很好。只要我不尝试传递参数,一切都能正常工作。这是我目前掌握的代码

大体上

在资源类中:

@Path("TestServer")
public class TestServerResource
{
    public static final String CLICHED_MESSAGE = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<note>\r\n<to>Tove</to>\r\n<from>Jani</from>\r\n<heading>Reminder</heading>\r\n<body>Don't forget me this weekend!</body>\r\n</note>\r\n\r\n";
    public static final String DO_MESSAGE = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<DoTask>\r\n\t<Response>%s</Response>\r\n</DoTask>\r\n\r\n";

    @GET
    @Path("getHello")
    @Produces(MediaType.APPLICATION_XML)
    public String getHello()
    {
        return CLICHED_MESSAGE;
    }

    @GET
    @Path("testGet3")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Produces(MediaType.APPLICATION_XML)
    public String testGet3(MultivaluedMap<String, String> formParams)
    {
        // Get the parameters.
        String argTitle = formParams.getFirst("title");
        String argAuthor = formParams.getFirst("author");

        // Create the XML response.
        String xmlResponse = String.format(DO_MESSAGE, String.format("Book Title %s with author %s", argTitle, argAuthor));

        return xmlResponse;
    }
}
@Path(“TestServer”)
公共类TestServerResource
{
public static final String CLICHED_MESSAGE=“\r\n\r\nTove\r\nJani\r\nMinder\r\n不要忘记我这个周末!\r\n\r\n\r\n”;
公共静态最终字符串DO\u MESSAGE=“\r\n\r\n\t%s\r\n\r\n\r\n”;
@得到
@路径(“getHello”)
@生成(MediaType.APPLICATION\u XML)
公共字符串getHello()
{
返回陈词滥调的消息;
}
@得到
@路径(“testGet3”)
@使用(MediaType.APPLICATION\u FORM\u URLENCODED)
@生成(MediaType.APPLICATION\u XML)
公共字符串testGet3(多值Map formParams)
{
//获取参数。
字符串argTitle=formParams.getFirst(“title”);
字符串argAuthor=formParams.getFirst(“作者”);
//创建XML响应。
String xmlResponse=String.format(DO_消息,String.format(“书名%s,作者%s”,argTitle,argAuthor));
返回XML响应;
}
}
在CentOS 7机箱上运行的售后服务。这是终端命令

工程(无参数):

[test@Turbo下载]$curl-H“接受:应用程序/xml”http://localhost:8081/base/TestServer/getHello"
托弗
贾尼
提醒
这个周末别忘了我!
使用参数不起作用:

[test@Turbo Downloads]$ curl -H "Accept: application/xml" "http://localhost:8081/base/TestServer/testGet3?title=smurfs&author=Gargamel"
<html><head><title>Grizzly 2.3.8</title><style><!--div.header {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#003300;font-size:22px;-moz-border-radius-topleft: 10px;border-top-left-radius: 10px;-moz-border-radius-topright: 10px;border-top-right-radius: 10px;padding-left: 5px}div.body {font-family:Tahoma,Arial,sans-serif;color:black;background-color:#FFFFCC;font-size:16px;padding-top:10px;padding-bottom:10px;padding-left:10px}div.footer {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#666633;font-size:14px;-moz-border-radius-bottomleft: 10px;border-bottom-left-radius: 10px;-moz-border-radius-bottomright: 10px;border-bottom-right-radius: 10px;padding-left: 5px}BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;}B {font-family:Tahoma,Arial,sans-serif;color:black;}A {color : black;}HR {color : #999966;}--></style> </head><body><div class="header">Request failed.</div><div class="body">Request failed.</div><div class="footer">Grizzly 2.3.8</div></body></html>[test@Turbo Downloads]$ 
[test@Turbo下载]$curl-H“接受:应用程序/xml”http://localhost:8081/base/TestServer/testGet3?title=smurfs&author=Gargamel"
Grizzly 2.3.8请求失败。请求失败。Grizzly 2.3.8[test@Turbo下载]$
在传递参数时,我确实用引号将url括起来,所以这不是问题所在。想法

以下是我阅读的一些资源:

  • 资源
在这个特定的示例中,当不使用参数时,指定一个用-H进行curl的头似乎无关紧要,因为我尝试了这两种方法,并且得到了正确的XML。我不必指定-X选项,因为GET是默认操作,这就是我要指定的。单引号和双引号产生相同的结果

我尝试实现GrizzlyWebContainerFactory,如中所述,但我无法让ant找到那个jar,即使Eclipse很高兴。我不想偏离正轨,所以我保持专注


想法?

首先,您的资源方法需要请求正文中的数据,因此应该将其更改为
@POST
,然后在
curl
命令中使用

curl -X POST "http://localhost:8081/base/TestServer/testGet3"
     -d "title=smurfs" -d "author=Gargamel"
如果希望使用GET将数据保存在URL中,那么应该将资源方法更改为

@GET
@Path("testGet3")
@Produces(MediaType.APPLICATION_XML)
public String testGet3(@Context UriInfo uriInfo)
{
    MultivaluedMap<String, String> params 
            = uriInfo.getQueryParameters();
}

另外,对于这样的问题(没有有用的错误消息),我通常采取的第一步是创建一个我注册的
ExceptionMapper
。通常会有一些异常被Jersey吞并,并被一些Jersey异常包裹,导致一个无用的500,而没有真正问题的信息。使用
ExceptionMapper
,在大多数情况下,它应该可以看到真正的异常,并且至少可以打印堆栈跟踪。有关
异常apper

疯狂猜测的信息,请参阅,但我猜它与
@GET
有关。一般来说,GET不应该有一个body。我知道之前Grizzly不支持允许主体删除(不确定GET),但可以将其配置为允许删除(GET的配置可能相同)。但无论如何,为了保持语义的真实性,请使用POST。更改
@POST
的方法,并将
-X POST
添加到
curl
命令中。看看会发生什么。@peeskillet同样的问题。我忘记添加我尝试在testGet3调用中添加system.out.println()消息,但这些消息从未显示。Grizzly从未调用过该方法,因此Grizzly既不喜欢curl语句,也不喜欢该方法的格式。您正在尝试传递查询字符串中的数据。我没注意到。在服务器上,您希望它作为主体。我会想象你得到一个NPE(“因为没有尸体”),它被泽西吞下,作为500发出去,灰熊会像你看到的那样返回。因此,要解决这个问题,请使用
@POST
-X POST
,而不是将数据放在URL中,使用
-d title=smurf-d author=Gargamel
解决类似问题(没有有用的错误消息),我通常采取的第一步是创建一个我注册的
异常apper
。通常会有一些异常被Jersey吞并,并被一些Jersey异常包裹,导致一个无用的500,而没有真正问题的信息。使用
ExceptionMapper
,在大多数情况下,它应该可以看到真正的异常,并且至少可以打印堆栈跟踪。请参阅以获取有关
异常映射的信息,仅供参考,如果您想使用GET并发送URL中的数据,我将首先删除
@Consumes
,因为这意味着您需要一个请求主体(这很混乱),然后如果您想要查询参数的
多值映射
,您可以将
@Context-UriInfo
注入该方法,然后调用
UriInfo.getQueryParameters()
,这将返回查询参数的
多值映射。或者对每个参数单独使用
@QueryParam(“title”)字符串title
curl -X POST "http://localhost:8081/base/TestServer/testGet3"
     -d "title=smurfs" -d "author=Gargamel"
@GET
@Path("testGet3")
@Produces(MediaType.APPLICATION_XML)
public String testGet3(@Context UriInfo uriInfo)
{
    MultivaluedMap<String, String> params 
            = uriInfo.getQueryParameters();
}
public String testGet3(@QueryParam("title") String title,
                       @QueryParam("author") String author)