【问题标题】:Programming a REST client - is there a framework similar to Axis/JAX-WS for SOAP编写 REST 客户端 - 是否有类似于 Axis/JAX-WS 的框架用于 SOAP
【发布时间】:2016-06-09 07:37:26
【问题描述】:

现在我正在学习如何构建 REST Web 服务 - 我正在尝试构建一个通过 XML(不是 JSON)进行通信的 REST 服务。

我在这里使用教程。 http://www.vogella.com/tutorials/REST/article.html

我创建了一个返回待办事项列表的 GET API

@GET
@Produces({ MediaType.TEXT_XML })
public List<ToDo> getXML() 
{
    ArrayList<ToDo> al = new ArrayList<ToDo>();

    ToDo t = new ToDo();
    t.setSummary("First ToDo");
    t.setDescription("This is my first ToDo");
    al.add(t);

    t.setSummary("2nd Todo");
    t.setDescription("This is my 2nd Todo");
    al.add(t);

    return al;
}

我有一个调用这个方法的客户端程序

String xmlAnswer =   

 target.path("rest").path("hello").request().accept(MediaType.TEXT_XML).get(String.class);

我收到以下回复

<?xml version="1.0" encoding="UTF-8" standalone="yes">
<toDoes>
    <toDo>
        <description>This is my 2nd Todo</description>
        <summary>2nd Todo</summary>
    </toDo>
    <toDo>
        <description>This is my 2nd Todo</description>
        <summary>2nd Todo</summary></toDo>
    </toDoes>
</toDoes>

但是,我确信有一种更简单的方法可以对客户端进行编程——我想获得一个 ToDo 对象数组而不是 XML。我该怎么做呢?如何为客户端 ToDo 类生成存根以及如何以 ToDo 对象数组的形式获得答案?

【问题讨论】:

  • 使用List&lt;Todo&gt; todos = ...get(new GenericType&lt;List&lt;Todo&gt;&gt;(){});
  • @peeskillet - 这非常有用。
  • @peeskillet - 我获取了输出 XML - 使用 xmlgrid.net/xml2xsd.html 从中创建 XSD - 然后使用 xjc 创建 ToDoes 类,然后调用 target.path("rest").path( "你好").request().accept(MediaType.TEXT_XML).get(ToDoes.class);感谢您的帮助

标签: java web-services rest frameworks jersey


【解决方案1】:

您可以使用 Spring-web API 来调用您的 REST 服务。

将 Spring-web 添加到您的类路径中,然后使用以下代码:

List<MyBean> beans = null;
RestTemplate template = new RestTemplate()
ParameterizedTypeReference<List<MyBean>> responseType = new ParameterizedTypeReference<List<MyBean>>() {};
Object requestParm = null;
ResponseEntity<List<MyBean>> response = template.exchange("http://example.com",HttpMethod.GET, requestParm, responseType);

if(response.getStatusCode() == HttpStatus.OK && response.hasBody()) {
            beans = response.getBody();
        }

【讨论】:

  • 如何生成 MyBean 类?
  • 您的意思是如何将响应从 REST 服务转换为 MyBean 实例列表?!它将被自动反序列化。但您应该为 exchange 方法提供您预期的返回类型。
  • 没有。我的意思是如何生成 MyBean 类的源代码?您正在使用 List 但 MyBean 类在哪里?
  • MyBean 是响应 bean 的示例,根据您的问题使用 ToDo 而不是 MyBean
  • 在 REST 服务中没有像 WSDL 这样的标准文档,所以我认为你应该手动创建类!
【解决方案2】:

根据@peeskillet 的评论,这就是我所做的。

我获取了输出 XML - 使用 http://xmlgrid.net/xml2xsd.html 从中创建 XSD - 然后使用 xjc 生成 ToDoes 类

ToDoes tds = target.path("rest").path("hello").request()
                        .accept(MediaType.TEXT_XML).get(ToDoes.class);

List<ToDoes.ToDo> l = tds.getToDo() ;

for (int i = 0; i < l.size(); ++i)
{
    System.out.println( "Summary"+i+":" + l.get(i).getSummary());
    System.out.println( "Summary"+i+":" + l.get(i).getDescription());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2018-03-28
    • 2012-04-16
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多