2009-11-12 5 views

Antwort

71

Stellt sich heraus, Sie müssen gar nicht viel an.

Siehe unten - der Parameter x enthält den vollständigen HTTP-Body (in unserem Fall XML).

@POST 
public Response go(String x) throws IOException { 
    ... 
} 
+5

Hinzufügen eines @Consumes (MediaType.TEXT_PLAIN) war auch für mich erforderlich. –

+0

Oder würde ich @consumses alles im Allgemeinen erraten? –

+0

Dies ist extrem hilfreich für das Debugging von Nachrichten in Jersey, wo aus irgendeinem Grund Netzwerkinspektion keine Option ist, aber Codeänderungen sind (lokale Integrationstests, in meinem Fall). – Patrick

0

Es scheint, dass Sie hier eine MessageBodyReader verwenden müssten. Hier ist ein Beispiel, mit jdom:

import org.jdom.Document; 
import javax.ws.rs.ext.MessageBodyReader; 
import javax.ws.rs.ext.Provider; 
import javax.ws.rs.ext.MediaType; 
import javax.ws.rs.ext.MultivaluedMap; 
import java.lang.reflect.Type; 
import java.lang.annotation.Annotation; 
import java.io.InputStream; 

@Provider // this annotation is necessary! 
@ConsumeMime("application/xml") // this is a hint to the system to only consume xml mime types 
public class XMLMessageBodyReader implements MessageBodyReader<Document> { 
    private SAXBuilder builder = new SAXBuilder(); 

    public boolean isReadable(Class type, Type genericType, Annotation[] annotations, MediaType mediaType) { 
    // check if we're requesting a jdom Document 
    return Document.class.isAssignableFrom(type); 
    } 

    public Document readFrom(Class type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) { 
    try { 
     return builder.build(entityStream); 
    } 
    catch (Exception e) { 
     // handle error somehow 
    } 
    } 
} 

Fügen Sie diese Klasse in die Liste der Ressourcen, um Ihre Jersey Deployment-Prozess (in der Regel über web.xml konfiguriert, glaube ich). Anschließend können Sie diese Leser in einem Ihrer regelmäßigen Ressourcenklassen wie folgt verwenden:

@Path("/somepath") @POST 
public void handleXMLData(Document doc) { 
    // do something with the document 
} 

Ich habe nicht nachgewiesen, dass das funktioniert genau wie eingegeben, aber das ist der Kern von ihm. Mehr lesen hier:

14

Sie könnten die @Consumes Anmerkung verwenden Sie den vollständigen Körper zu erhalten:

import javax.ws.rs.Consumes; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.core.MediaType; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerConfigurationException; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
import org.w3c.dom.Document; 

@Path("doc") 
public class BodyResource 
{ 
    @POST 
    @Consumes(MediaType.APPLICATION_XML) 
    public void post(Document doc) throws TransformerConfigurationException, TransformerException 
    { 
    Transformer tf = TransformerFactory.newInstance().newTransformer(); 
    tf.transform(new DOMSource(doc), new StreamResult(System.out)); 
    } 
} 

Hinweis: Vergessen Sie nicht den "Content-Type: application/xml" Header durch die Anfrage.

5

Da Sie Daten in XML übertragen, können Sie auch direkt von/zu pojos (un) marshalen.

Es ist ein Beispiel (und weitere Informationen) in der jersey user guide, die ich hier kopieren:

POJO mit JAXB Anmerkungen:

@XmlRootElement 
public class Planet { 
    public int id; 
    public String name; 
    public double radius; 
} 

Ressource:

@Path("planet") 
public class Resource { 

    @GET 
    @Produces(MediaType.APPLICATION_XML) 
    public Planet getPlanet() { 
     Planet p = new Planet(); 
     p.id = 1; 
     p.name = "Earth"; 
     p.radius = 1.0; 

     return p; 
    } 

    @POST 
    @Consumes(MediaType.APPLICATION_XML) 
    public void setPlanet(Planet p) { 
     System.out.println("setPlanet " + p.name); 
    } 

}  

Das XML, das produziert/konsumiert wird:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<planet> 
    <id>1</id> 
    <name>Earth</name> 
    <radius>1.0</radius> 
</planet> 
10

diese mit diesem einzigen Code Versuchen:

import javax.ws.rs.POST; 
import javax.ws.rs.Path; 

@Path("/serviceX") 
public class MyClassRESTService { 

    @POST 
    @Path("/doSomething") 
    public void someMethod(String x) { 

     System.out.println(x); 
       // String x contains the body, you can process 
       // it, parse it using JAXB and so on ... 

    } 
} 

die URL für try Rest Dienste Enden ..../serviceX/doSomething