从 Java 调用 Restful Service

2022-09-03 10:07:58

在这里,我不是在创建一个RESTful服务,事实上我必须从我的java代码中调用外部Restful服务。目前,我正在使用Apache HttpClient实现它。我从 Web 服务获得的响应是 XML 格式。我需要从XML中提取数据并将它们放在Java对象上。我听说我们可以使用 JAX-RS 和 JERSEY,而不是使用 SAX 解析器,它们会自动将 xml 标记映射到相应的 java 对象。

我一直在寻找,但无法找到开始的来源。我确实查看了使用Java中的Java RESTful调用使用RESTful API的现有链接

任何帮助都是值得赞赏的。

谢谢!!


答案 1

更新

作为后续:我可以这样做吗?如果 xml 返回为 4 .....如果我正在构造一个 Person 对象,我相信这会窒息。我可以只绑定我想要的 xml 元素吗?如果是,我该怎么做。

您可以按如下方式映射此 XML:

输入.xml

<?xml version="1.0" encoding="UTF-8"?>
<Persons>
    <NumberOfPersons>2</NumberOfPersons>
        <Person>
            <Name>Jane</Name>
            <Age>40</Age>
        </Person>
        <Person>
            <Name>John</Name>
            <Age>50</Age>
        </Person>
</Persons> 

package forum7177628;

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="Persons")
@XmlAccessorType(XmlAccessType.FIELD)
public class Persons {

    @XmlElement(name="Person")
    private List<Person> people;

}

package forum7177628;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;

@XmlAccessorType(XmlAccessType.FIELD)
public class Person {

    @XmlElement(name="Name")
    private String name;

    @XmlElement(name="Age")
    private int age;

}

演示

package forum7177628;

import java.io.File;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Persons.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Persons persons = (Persons) unmarshaller.unmarshal(new File("src/forum7177628/input.xml"));

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(persons, System.out);
    }

}

输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Persons>
    <Person>
        <Name>Jane</Name>
        <Age>40</Age>
    </Person>
    <Person>
        <Name>John</Name>
        <Age>50</Age>
    </Person>
</Persons>

原始答案

下面是使用 Java SE API(包括 JAXB)调用 RESTful 服务的示例:

String uri =
    "http://localhost:8080/CustomerService/rest/customers/1";
URL url = new URL(uri);
HttpURLConnection connection =
    (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Accept", "application/xml");

JAXBContext jc = JAXBContext.newInstance(Customer.class);
InputStream xml = connection.getInputStream();
Customer customer =
    (Customer) jc.createUnmarshaller().unmarshal(xml);

connection.disconnect();

欲了解更多信息:


答案 2

JAX-RS 是用于 restful webservice 的 Java api。泽西岛是来自sun/oracle的实现。

您需要jaxb才能将xml转换为POJO。但并非总是这样,转换后的对象可以在没有任何转换的情况下使用。如果这是这种情况,SAXParser是一个不错的解决方案。

这是一个关于JAXB的很好的教程。