从Java调用Restful Service

时间:2011-08-24 14:57:10

标签: java web-services rest

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

我一直在寻找但无法找到入门资源。 我确实看过现有的链接 Consuming RESTful APIs using Java RESTful call in Java

任何帮助都值得赞赏。

谢谢!

5 个答案:

答案 0 :(得分:17)

<强>更新

  

跟进这个:我可以这样做吗?如果返回xml   如4      .....   如果我正在构建一个Person对象,我相信这会扼杀。   我可以只绑定我想要的xml元素吗?如果是,我该怎么办   这一点。

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

<强> input.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();

更多信息:

答案 1 :(得分:7)

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

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

Here是一个很好的JAXB教程。

答案 2 :(得分:4)

您可以考虑使用jaxb将java对象绑定到xml文档(编组)。

http://www.oracle.com/technetwork/articles/javase/index-140168.html#xmp1

答案 3 :(得分:3)

我使用Apache CXF来构建我的RESTful服务,这是另一个JAX-RS实现(它还提供了JAX-WS实现)。我还在单元测试中使用它的“org.apache.cxf.jaxrs.client.WebClient”类,它将完全管理所有的编组和解组。你给它一个URL并要求一个特定类型的对象,它完成所有的工作。我不知道泽西岛是否有类似的设施。

答案 4 :(得分:1)

如果您还需要转换作为服务调用响应的xml字符串,您需要的x对象可以按如下方式执行:

 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.StringReader;
 import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;

 import javax.xml.bind.JAXB;
 import javax.xml.bind.JAXBException;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;

 import org.w3c.dom.CharacterData;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;

 public class RestServiceClient {

// http://localhost:8080/RESTfulExample/json/product/get
public static void main(String[] args) throws ParserConfigurationException,
    SAXException {

try {

    URL url = new URL(
        "http://localhost:8080/CustomerDB/webresources/co.com.mazf.ciudad");
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setRequestMethod("GET");
    conn.setRequestProperty("Accept", "application/xml");

    if (conn.getResponseCode() != 200) {
    throw new RuntimeException("Failed : HTTP error code : "
        + conn.getResponseCode());
    }

    BufferedReader br = new BufferedReader(new InputStreamReader(
        (conn.getInputStream())));

    String output;

    Ciudades ciudades = new Ciudades();
    System.out.println("Output from Server .... \n");
    while ((output = br.readLine()) != null) {
    System.out.println("12132312");
    System.err.println(output);

    DocumentBuilder db = DocumentBuilderFactory.newInstance()
        .newDocumentBuilder();
    InputSource is = new InputSource();
    is.setCharacterStream(new StringReader(output));

    Document doc = db.parse(is);
    NodeList nodes = ((org.w3c.dom.Document) doc)
        .getElementsByTagName("ciudad");

    for (int i = 0; i < nodes.getLength(); i++) {
        Ciudad ciudad = new Ciudad();
        Element element = (Element) nodes.item(i);

        NodeList name = element.getElementsByTagName("idCiudad");
        Element element2 = (Element) name.item(0);

        ciudad.setIdCiudad(Integer
            .valueOf(getCharacterDataFromElement(element2)));

        NodeList title = element.getElementsByTagName("nomCiudad");
        element2 = (Element) title.item(0);

        ciudad.setNombre(getCharacterDataFromElement(element2));

        ciudades.getPartnerAccount().add(ciudad);
    }
    }

    for (Ciudad ciudad1 : ciudades.getPartnerAccount()) {
    System.out.println(ciudad1.getIdCiudad());
    System.out.println(ciudad1.getNombre());
    }

    conn.disconnect();

} catch (MalformedURLException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
}

public static String getCharacterDataFromElement(Element e) {
Node child = e.getFirstChild();
if (child instanceof CharacterData) {
    CharacterData cd = (CharacterData) child;
    return cd.getData();
}
return "";
}

}

请注意,我在示例中预期的xml结构如下:

 <ciudad><idCiudad>1</idCiudad><nomCiudad>BOGOTA</nomCiudad></ciudad>