2016-08-16 14 views
0

POSTによって送信されたXML文字列を受け取るREST APIメソッドを作成したいとします。私はSwagger Editorを使ってREST APIのトップダウンを設計し、サーバースタブコードを生成しています。Swaggerで生成されたSpringサーバーコードのPOST RequestBodyからXML文字列を取得する方法は?

POSTメソッドは、私の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 

私はまた、YAMLファイルで、このグローバル設定があります:私は、サーバーの生成闊歩編集者を使用する場合

produces: 
    - application/json 

を>春メニューオプション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); 

、これは、対応するスタブ実装である:私はプリントアウトしたときに

Postman screenshot

しかし:私は、実行中のSpringbootサービスの方法にいくつかのダミーXMLを投稿するポストマンを使用

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

実装方法の中でmodelの値をlog.debug("Model XML = " + model);とすると、次のように出力されます。

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

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

XML自体をmodelの値にするにはどうすればよいですか?私はそれがこの例では、代わりにこのようにしたい:

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

が闊歩エディタがそれらを生成しているので、私はちょうど直接Javaメソッドのシグネチャを編集することはできません覚えておいてください。私のすっきりした定義が間違っている場合、代わりにXML文字列をポストするために何を使用すべきですか?

XMLは実際には大きく、リクエストパラメータとして送信することはオプションではありません。私もXMLを処理するつもりはないので、文字列として扱うことは大丈夫です。

答えて

0

postmanでは、フォームデータをrawに切り替え、関連するコンテンツタイプ(application/xml)を選択します。

あなたは春がリクエストボディ(あなたのパラメータのための@RequestBody注釈)

+0

ありがとうございました!私がしなければならなかったのは、生のフィールドに '<?xml version =" 1.0 "encoding =" utf-8 "?>'を入れてサービスで受け取ったものです。したがって、パラメータ 'model'は重複していました。 – snark

0

にあるように、あなたのオブジェクトを期待しているので、これをしなければならない、あなたは最低限のコンバータを持っているし、として、JSON/XMLを読みたい場合はコンテンツタイプを文字列に変換するコンバータも必要になります。 StringHttpMessageConverterはそれだけです。

<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> 
関連する問題