2016-08-16 1 views
0

Ich möchte eine REST-API-Methode erstellen, die eine vom POST gesendete XML-Zeichenfolge empfängt. Ich verwende Swagger Editor, um meine REST-API von oben nach unten zu entwerfen und den Server-Stubcode zu generieren.Wie Sie eine XML-Zeichenfolge von einem POST RequestBody in Swagger-generiertem Spring Server-Code abrufen?

Die POST-Methode sieht wie folgt in meinem swagger.yaml:

/models: 
    post: 
     summary: Store a model. 
     description: Stores the XML content of the specified model. 
     consumes: 
     - application/xml;charset=UTF-8 
     parameters: 
     - name: model 
      in: body 
      description: The model XML you want to store 
      schema: 
      type: string 
      required: true 
     responses: 
     201: 
      description: Model stored successfully 
      headers: 
      location: 
       description: URL of the stored model. 
       type: string 

Ich habe auch diese globale Einstellung in der YAML-Datei:

produces: 
    - application/json 

Wenn ich die Prahlerei des Herausgebers Server generieren> Frühling Menüoption Die folgende Schnittstellenmethode wird für die POST-Methode generiert:

@ApiOperation(value = "Store a model.", notes = "Stores the XML content of the specified model.", response = Void.class, tags={ }) 
    @ApiResponses(value = { 
     @ApiResponse(code = 201, message = "Model stored successfully", response = Void.class) }) 
    @RequestMapping(value = "/models", 
     produces = { "application/json" }, 
     consumes = { "application/xml;charset=UTF-8" }, 
     method = RequestMethod.POST) 
    ResponseEntity<Void> modelsPost(

@ApiParam(value = "The model XML you want to store" ,required=true) @RequestBody String model); 

und dies ist die entsprechende Stub-Implementierung:

public ResponseEntity<Void> modelsPost(
@ApiParam(value = "The model XML you want to store" ,required=true) @RequestBody String model 

) { 
     // do some magic! 
     return new ResponseEntity<Void>(HttpStatus.OK); 
    } 

Ich benutze Postman einig Dummy-XML das Verfahren auf meinem Laufen Springboot Dienst zu schreiben:

Postman screenshot

Aber wenn ich das Ausdrucken Wert von model innerhalb der Implementierungsmethode mit log.debug("Model XML = " + model); Ich bekomme so in den Protokollen ausgegeben:

Model XML = ------WebKitFormBoundaryA3o70hOgLFoLLBoY 
Content-Disposition: form-data; name="model" 

<?xml version="1.0" encoding="utf-8"?><Hello></Hello> 
------WebKitFormBoundaryA3o70hOgLFoLLBoY-- 

Wie bekomme ich nur die XML selbst in den Wert model? Ich möchte es dies in diesem Beispiel statt sein:

<?xml version="1.0" encoding="utf-8"?><Hello></Hello> 

Denken Sie daran, kann ich nicht nur die direkt Signaturen Java-Methode bearbeiten, da die Swagger Editor sie erzeugt. Wenn meine Swagger-Definition falsch ist, was sollte ich stattdessen verwenden, um eine XML-Zeichenkette zu posten?

Die XML in der Praxis ist wahrscheinlich groß, so dass es als Anforderungsparameter keine Option ist. Ich werde das XML auch nicht verarbeiten, daher ist es in Ordnung, es als String zu behandeln.

Antwort

0

Wechseln Sie im Postboten von Formulardaten zu Rohdaten und wählen Sie den relevanten Inhaltstyp (application/xml) aus.

Sie haben, dies zu tun, weil Frühling Ihr Objekt erwartet in der Anfrage Körper zu sein (wegen der @RequestBody Anmerkung auf Ihrem Parameter)

+0

Danke - das hat funktioniert! Alles, was ich tun musste, war '' im rohen Feld und das wurde vom Dienst empfangen. Also war der Parameter "Modell" überflüssig. – snark

0

Wenn Sie das Nötigste Konvertern und wollen die Json/XML lesen, wie Zeichenfolge, benötigen Sie auch einen Konverter, um den Inhaltstyp in Zeichenfolge zu konvertieren. StringHttpMessageConverter macht genau das.

<mvc:annotation-driven 
    content-negotiation-manager="contentNegotiationManager"> 
    <mvc:message-converters register-defaults="false"> 
     <bean 
      class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
      <property name="objectMapper" ref="jacksonObjectMapper" /> 
      <property name="supportedMediaTypes"> 
       <list> 
        <value>application/json</value> 
       </list> 
      </property> 
     </bean> 
     <bean 
      class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter"> 
      <constructor-arg ref="jaxbMarshaller" /> 
      <constructor-arg ref="jaxbUnMarshaller" /> 
      <property name="supportedMediaTypes"> 
       <list> 
        <value>application/xml</value> 
        <value>text/xml</value> 
       </list> 
      </property> 
     </bean> 
     <bean class="org.springframework.http.converter.StringHttpMessageConverter"> 
      <property name="supportedMediaTypes"> 
       <list> 
        <value>text/plain</value> 
        <value>application/xml</value> <!-- extract xml as string --> 
       </list> 
      </property> 
      <property name="writeAcceptCharset" value="true" /> 
     </bean> 
Verwandte Themen