无法使用的球衣客户端使用RESTful Web服务

问题描述:

我的服务端代码使用RestEasy的无法使用的球衣客户端使用RESTful Web服务

@GET 
@Path("/ad-details/{query}") 
@Produces("application/json") 
public String getAdDetails(@PathParam("query") String id) 
{ 
    //Validator v = ESAPI.encoder().encodeForHTML(id); 
    //String id1 = ; 
    //System.out.println(ESAPI.encoder().encodeForHTML(ESAPI.encoder().canonicalize(id1))); 
    String adDetailsResult = ""; 
    System.out.println("reached Service"); 
    AdServiceProvider ad = new AdServiceProviderImpl(); 
    AdDetails details = ad.getAdDetailsById(Long.parseLong(id.trim())); 
    adDetailsResult = gson.toJson(details); 
    //System.out.println(adDetailsResult); 
    //adDetailsResult = ESAPI.encoder().encodeForHTML(ESAPI.encoder().canonicalize(adDetailsResult)); 
    System.out.println(adDetailsResult); 
    return adDetailsResult; 


} 

实现,我的客户端代码消耗此服务被使用的球衣API 和代码如下所述。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    // TODO Auto-generated method stub 
    System.out.println("reached servlet"); 
    response.setContentType("application/json"); 
    String adId = request.getParameter("adId"); 
    System.out.println(adId); 
    Client client = Client.create(); 
    WebResource wr = client.resource("http://localhost:8080/com.pandora.services/service"); 
    String adDetailsResult = wr.path("ad-details").path(adId).get(String.class); 

    PrintWriter out = response.getWriter(); 
    out.print(adDetailsResult); 
}'` 

然而,当我拨打电话我收到以下错误

WARN org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher解析失败请求。 java.lang.IllegalArgumentException:解析媒体类型'*; q = .2' at com.sun.jersey.core.impl.provider.header.MediaTypeProvider.fromString(MediaTypeProvider.java:80) at com.sun.jersey.core.impl.provider.header.MediaTypeProvider.fromString (MediaTypeProvider.java:53) 在javax.ws.rs.core.MediaType.valueOf(MediaType.java:173) 在org.jboss.resteasy.util.MediaTypeHelper.parseHeader(MediaTypeHelper.java:204) 在有机.jboss.resteasy.plugins.server.servlet.ServletUtil.extractAccepts(ServletUtil.java:119) at org.jboss.resteasy.plugins.server.servlet.ServletUtil.extractHttpHeaders(ServletUtil.java:82) at org.jboss .resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:186) at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServ letDispatcher.java:55) 在org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50) 在javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在org.apache.catalina.core.StandardWrapperValve。调用(StandardWrapperValve.java:233) 在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 在org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 在org.apache.coyote.http11。 Http11Processor.process(Http11Processor.java:857) at org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:588) at org.apache.tomcat.util.net.JIoEndpoint $ Worker.run( JIoEndpoint.java:489) at java.lang.Thread.run(Unknown Source) 引起:java.text.ParseException:期望的分隔符'/'而不是';' at com.sun.jersey.core.header.reader.HttpHeaderReader.nextSeparator(HttpHeaderReader.java:117) at com.sun.jersey.core.impl.provider.header.MediaTypeProvider.valueOf(MediaTypeProvider.java:91) at com.sun.jersey.core.impl.provider.header.MediaTypeProvider.fromString(MediaTypeProvider.java:78) ... 21更多 2011年5月10日上午7:14:50 org.apache.catalina.core在org.jboss Servlet.service()进行的servlet RestEasy的抛出异常 显示java.lang.NullPointerException 在org.jboss.resteasy.plugins.server.servlet.HttpServletInputMessage(HttpServletInputMessage.java:60) :.StandardWrapperValve调用 严重。 .resteasy.plugins.server.servlet.HttpServletDispatcher.createHttpRequest(HttpServletDispatcher.java:71) at org.jboss.resteasy.plugins.server。servlet.HttpServletDispatcher.createResteasyHttpRequest(HttpServletDispatcher.java:60) at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:197) at org.jboss.resteasy.plugins.server.servlet。 HttpServletDispatcher.service(HttpServletDispatcher.java:55) 在org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50) 在javax.servlet.http.HttpServlet.service(HttpServlet.java: 820) 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在org.apache.catalina。 core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 在org.apache.catalina.valves。 ErrorReportValve.invoke(ErrorReportValve.java:102) 在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 在org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857) 在org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:588) 在org.apache.tomcat。 util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Unknown Source) 2011年5月10日上午7点14分50秒org.apache.catalina.core.StandardWrapperValve调用 SEVERE:servlet的Servlet.service()AdDetailsS​​ervlet抛出异常 com.sun.jersey.api.client.UniformInterfaceException:GET返回http://localhost:8080/com.pandora.services/service/ad-details/1返回com.sun.jersey.api.client.WebResource.handle(WebResource.java:565) at com.sun.jersey.api.client.WebResource.get(WebResource.java:182) 的响应状态为500 at com.pandora.client.servlets.AdDetailsS​​ervlet.doPost(AdDetailsS​​ervlet.java:48) at com.pandora.client.servlets.AdDetailsS​​ervlet.doGet(AdDetailsS​​ervlet.java:34) at javax.servlet.http.HttpServlet.service (HttpServlet.java:707) at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core。 StandardWrapperValve.invoke(StandardWrapperValve.java:233) 在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 在org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 在org.apache.catalina.connector。 CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.htt p11.Http11Processor.process(Http11Processor.java:857) at org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:588) at org.apache.tomcat.util.net.JIoEndpoint $ Worker。运行(JIoEndpoint.java:489) 在java.lang.Thread.run(来源不明)

我在哪里做的错误?

感谢

的错误信息是这样的:

Error parsing media type '*; q=.2'

这让我觉得我应该寻找具有某种媒体类型相关的头问题来自客户的请求。也许你应该为响应指定一个MIME类型。它看起来像你期待的服务返回JSON,那么请求中的specifying the Accept header怎么样?

Client client = Client.create(); 
WebResource wr = 
    client.resource("http://localhost:8080/com.pandora.services/service"); 
String adDetailsResult = wr.path("ad-details").path(adId) 
    .accept(MediaType.APPLICATION_JSON).get(String.class); 
+0

当使用restful web服务时,请求/响应的HTTP头比任何stacktrace都有用。响应标头指示接受的内容类型;而JSON不是,因为它落在*(其他人)中。查看响应头文件就足以知道如何与此资源进行交互。 – 2011-05-10 09:46:46