2016-08-16 1 views
0

Je souhaite créer une méthode API REST qui reçoit une chaîne XML envoyée par POST. J'utilise Swagger Editor pour concevoir mon API REST de manière descendante et pour générer le code de remplacement du serveur.Comment récupérer une chaîne XML à partir d'un POST RequestBody dans un code de serveur Spring généré par Swagger?

La méthode POST ressemble à ceci dans mon 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 

J'ai aussi ce paramètre global dans le fichier YAML:

produces: 
    - application/json 

Lorsque j'utilise le de Swagger Editor Générer serveur> Spring option de menu la méthode d'interface suivante est générée pour la méthode POST:

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

et c'est la mise en œuvre du talon correspondant:

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

J'utilise Postman d'afficher du XML factice à la méthode sur mon service Springboot de fonctionnement:

Postman screenshot

Mais quand j'imprimer le valeur de model à l'intérieur de la méthode de mise en œuvre avec log.debug("Model XML = " + model); Je reçois une sortie comme celle-ci dans les journaux:

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

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

Comment puis-je obtenir uniquement le XML lui-même dans la valeur de model? Je veux que ce soit ce lieu dans cet exemple:

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

Rappelez-vous que je ne peux pas modifier les signatures de méthode Java directement parce que l'éditeur est Swagger les générer. Si ma définition swagger est fausse, que devrais-je utiliser à la place pour publier une chaîne XML? En pratique, le code XML est susceptible d'être volumineux, l'envoyer en tant que paramètre de requête n'est donc pas une option. Je ne vais pas non plus traiter le XML, donc je peux le traiter comme une chaîne de caractères.

Répondre

0

Dans Facteur, passez de format-données à brut et sélectionnez le type de contenu approprié (application/xml).

Vous devez faire cela parce que le printemps attend votre objet dans le corps de la demande (en raison de @RequestBody d'annotation sur votre paramètre)

+0

Merci - cela a fonctionné! Tout ce que j'avais à faire était de mettre 'dans le champ brut et c'est ce qui a été reçu par le service. Le paramètre 'model' était donc redondant. – snark

0

Si vous avez les convertisseurs de strict minimum et que vous voulez lire le JSON/XML chaîne, vous aurez également besoin d'un convertisseur pour convertir le type de contenu en chaîne. StringHttpMessageConverter fait juste cela.

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