2011-08-24 36 views
15

Aquí no estoy creando un servicio RESTful, de hecho tengo que llamar a un servicio Restful externo desde mi código java. Actualmente estoy implementando esto usando Apache HttpClient. La respuesta que obtengo del servicio web es en formato XML. Necesito extraer los datos de XML y ponerlos en objetos Java. En lugar de utilizar el analizador SAX, escuché que podemos usar JAX-RS y JERSEY, que asigna automáticamente las etiquetas xml a los objetos correspondientes de Java.llamando a Restful Service desde Java

He estado revisando pero no he podido encontrar una fuente para comenzar. Yo miro enlaces existentes Consuming RESTful APIs using Java RESTful call in Java

cualquier ayuda se agradece en el movimiento hacia adelante.

Gracias!

+0

si se puede llamar el servicio y obtener JSON en cambio, el GSON/Jackson Apis son más fáciles que jaxb, en que no es necesario anotaciones en el modelo de objetos – Kevin

+0

Hola Kevin, tengo un servicio REST externa y quiero llamarlo desde la aplicación web. ¿Cuál es la mejor manera de hacerlo? El servicio REST devuelve el formato JSON como respuesta. dijiste que es fácil manejar la respuesta JSON. ¿Puedes explicar cómo? – Jignesh

Respuesta

16

ACTUALIZACIÓN

como sigo con esto: ¿Puedo hacer de esta manera ?? si el xml se devuelve como 4 ..... Si estoy construyendo un objeto Person, creo que esto se paralizará. ¿Puedo vincular solo los elementos xml que deseo? Si es así, ¿cómo puedo hacer eso.

Usted puede asignar este XML de la siguiente manera:

entrada.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> 

Personas

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; 

} 

persona

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; 

} 

demostración

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

} 

salida

<?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> 

respuesta original

A continuación se muestra un ejemplo de llamar a un servicio REST uso de la API de Java SE incluyendo 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(); 

Para más información:

+1

como seguimiento con esto: ¿Puedo hacerlo de esta manera? si el XML que se devuelve como 4 ..... Si estoy construyendo un objeto Person , Creo que esto se paralizará ¿Puedo vincular solo los elementos xml que deseo? Si es así, ¿cómo puedo hacer eso? – Rishi

6

JAX-RS es la API Java para servicio web reparador. Jersey es una implementación de sun/oracle.

Necesita jaxb para convertir su xml a POJO. Pero no es siempre el caso de que el objeto convertido se pueda usar sin ninguna transformación. Si este es el escenario, SAXParser es una buena solución.

Here es un buen tutorial sobre JAXB.

3

Utilizo Apache CXF para crear mis servicios RESTful, que es otra implementación de JAX-RS (también proporciona una implementación de JAX-WS). También utilizo su clase "org.apache.cxf.jaxrs.client.WebClient" en pruebas unitarias, que administrarán por completo todas las clasificaciones y desasignaciones bajo las cubiertas. Le das una URL y pides un objeto de un tipo particular, y hace todo el trabajo. No sé si Jersey tiene instalaciones similares.

1

Si también necesita convertir esa cadena XML que surge como respuesta a la llamada de servicio, una x objeto que necesita puede hacerlo de la siguiente manera:

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 ""; 
} 

}

Tenga en cuenta que la estructura XML que me esperaba en el ejemplo es el siguiente:

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