вызов Restful Service из Java - PullRequest
       0

вызов Restful Service из Java

15 голосов
/ 24 августа 2011

Здесь я не создаю службу RESTful, действительно, мне нужно вызвать внешнюю службу Restful из моего кода Java. В настоящее время я реализую это с помощью Apache HttpClient. Ответ, который я получаю от веб-службы, находится в формате XML. Мне нужно извлечь данные из XML и поместить их в объекты Java. Вместо того, чтобы использовать анализатор SAX, я слышал, что мы можем использовать JAX-RS и JERSEY, которые автоматически сопоставляют теги xml с соответствующими объектами java.

Я просматриваю, но не могу найти источник, чтобы начать. Я посмотрел на существующие ссылки Использование RESTful API с использованием Java RESTful вызов в Java

Любая помощь в продвижении приветствуется.

Спасибо !!

Ответы [ 5 ]

17 голосов
/ 24 августа 2011

ОБНОВЛЕНИЕ

как это сделать: могу ли я сделать это ??если 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>

ОРИГИНАЛЬНЫЙ ОТВЕТ

Ниже приведен пример вызова службы RESTful с использованием API Java SE, включая JAXB:

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();

Для получения дополнительной информации:

7 голосов
/ 24 августа 2011

JAX-RS - это API Java для полноценного веб-сервиса. Джерси - это реализация от Sun / Oracle.

Вам необходимо jaxb , чтобы преобразовать ваш xml в POJO.Но это не всегда так, что преобразованный объект можно использовать без каких-либо преобразований.Если это сценарий, SAXParser - хорошее решение.

Здесь - хорошее руководство по JAXB.

4 голосов
/ 24 августа 2011

Вы можете использовать jaxb для привязки ваших java-объектов к XML-документу (сортировка).

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

3 голосов
/ 24 августа 2011

Я использую Apache CXF для создания моих служб RESTful, что является еще одной реализацией JAX-RS (она также обеспечивает реализацию JAX-WS). Я также использую его класс "org.apache.cxf.jaxrs.client.WebClient" в модульных тестах, который полностью управляет всем маршалингом и демаршаллингом под прикрытием. Вы даете ему URL и запрашиваете объект определенного типа, и он выполняет всю работу. Я не знаю, есть ли на Джерси аналогичные объекты.

1 голос
/ 09 декабря 2016

Если вам также нужно преобразовать эту строку 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>       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...