【问题标题】:Issue calling RESTFul Web Service from Client using Jersey使用 Jersey 从客户端调用 RESTFul Web 服务的问题
【发布时间】:2016-06-21 22:13:30
【问题描述】:

我正在尝试使用 Jersey 并关注 this example 来学习 RESTFul Web 服务。我创建了一个示例服务,可在以下位置访问:

    http://localhost:8080/de.vogella.jersey.first/rest/hello. 

我创建了一个调用此服务的客户端,但是当我运行此客户端时,出现如下异常:

   GET http://localhost:8080/de.vogella.jersey.first/rest/hello 
     returned a response status of 404 Not Found Exception in thread "main"  
   com.sun.jersey.api.client.UniformInterfaceException: 
     GET http://localhost:8080/de.vogella.jersey.first/rest/hello 
       returned a response status of 404 Not Found
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:686)
at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:507)
at de.vogella.jersey.first.client.Test.main(Test.java:23)

服务类是

public class Hello {

  // This method is called if TEXT_PLAIN is request
  @GET
  @Produces(MediaType.TEXT_PLAIN)
  public String sayPlainTextHello() {
    return "Hello Jersey";
  }

  // This method is called if XML is request
  @GET
  @Produces(MediaType.TEXT_XML)
  public String sayXMLHello() {
    return "<?xml version=\"1.0\"?>" + "<hello> Hello Jersey" + "</hello>";
  }

  // This method is called if HTML is request
  @GET
  @Produces(MediaType.TEXT_HTML)
  public String sayHtmlHello() {
    return "<html> " + "<title>" + "Hello Jersey" + "</title>"
        + "<body><h1>" + "Hello Jersey" + "</body></h1>" + "</html> ";
  }
}

客户代码:

public class Test {
  public static void main(String[] args) {
    ClientConfig config = new DefaultClientConfig();
    Client client = Client.create(config);
    WebResource service = client.resource(getBaseURI());
    System.out.println(service.path("rest").path("hello").accept(MediaType.TEXT_PLAIN).get(ClientResponse.class).toString());  
    System.out.println(service.path("rest").path("hello").accept(MediaType.TEXT_XML).get(String.class));        
    private static URI getBaseURI() {
    return UriBuilder.fromUri("http://localhost:8080/de.vogella.jersey.first").build();
  }
} 

奇怪的是,如果我点击,我可以得到正确的结果

    http://localhost:8080/de.vogella.jersey.first/rest/hello 

来自浏览器。任何解决此问题的帮助表示赞赏。 谢谢

【问题讨论】:

  • 有什么问题?什么不工作?
  • 问题是,客户端无法访问在浏览器中正常工作的 url。我今天真的需要让它工作。请帮忙。
  • 您从客户端发送了哪些 HTTP 标头?

标签: java web-services jersey


【解决方案1】:

根据您在服务应用程序中的要求,您在创建类之前没有提及“路径”注释,例如:

@Path("hello")
public class Hello {

}

这只是您的服务应用程序中的问题。

【讨论】:

    【解决方案2】:

    网址:de.vogella.jersey.first/rest/hello

    1) 确保您已提供 Servlet 映射以从 URL 解析“rest”

      <servlet>
        <servlet-name>jersey-serlvet</servlet-name>
            ...
      </servlet>
      <servlet-mapping>
        <servlet-name>jersey-serlvet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
      </servlet-mapping>
    

    2) 在方法上方添加@Path("hello") 声明。

      @Path("hello")
      public String sayXMLHello() {}
    

    【讨论】:

      【解决方案3】:

      如果您想以另一种方式运行该示例,而不是在以下函数中传递您在浏览器中传递的整个 url,那么在此示例中我没有遇到任何问题,您将在主类中获得结果。

      private String doGet(String url){
              ClientConfig config = new DefaultClientConfig();
              Client client = Client.create(config);
              WebResource resource = client.resource(url);
              ClientResponse response = resource.type("application/x-www-form-urlencoded").get(ClientResponse.class);
              String en = response.getEntity(String.class);
              return en;
          }
      

      【讨论】:

        【解决方案4】:

        你应该使用:

        http://localhost:8080/hello
        

        而不是

        http://localhost:8080/de.vogella.jersey.first/rest/hello
        

        用于测试目的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-22
          • 2011-03-26
          • 1970-01-01
          • 2012-07-24
          • 1970-01-01
          • 1970-01-01
          • 2011-06-29
          • 1970-01-01
          相关资源
          最近更新 更多