2017-10-19 14 views
0

コンテンツタイプmultipart/mixedのみを受け付けるREST APIがあります。スプリングブートRestTemplate - マルチパート/混合

restTemplateを使用して、コンテンツタイプmultipart/mixedのREST要求を生成しようとしています。 私がコメントした場合setContentType restTemplateのデフォルトはmultipart/form-dataです。

setContentType(MediaType.parseMediaType("multipart/mixed")) 

いいえ、私はどのようにmultipart/mixed要求を生成するAPIを呼び出すことができますどのような例ですか?

たぶん、これには、残念ながら、実際には「春-ウェブ4.3.12.RELEASE.jar」からスプリングスRestTemplateの現在の実装で、あなたの問題を解決する方法はありません

HttpHeaders publishHeaders = new HttpHeaders(); 
publishHeaders.set(HEADER_TABLEAU_AUTH, token); 
publishHeaders.setContentType(MediaType.parseMediaType("multipart/mixed")); 
String response; 
LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>(); 
String payload = "<tsRequest>\n" + 
     ............................ 
     "</tsRequest>"; 
map.add(TABLEAU_PAYLOAD_NAME, payload); 
map.add("tableau_datasource", new FileSystemResource("/extract/test.tde")); 
HttpEntity<LinkedMultiValueMap<String, Object>> entity = new HttpEntity<>(map, publishHeaders); 
try { 
response = restTemplate.postForObject(url + PUBLISH_DATASOURCE_SINGLE_CHUNK, entity, String.class, siteId); 
} catch (RestClientException restEx) { 
    log.error(....); 
    throw restEx; 
} 
+0

コントローラーメソッドまたはその例を共有できますか? – Pytry

+0

ここにサンプルコードを追加 – fastlearner

+0

応答本体として何か戻ることを期待していますか?それとも、HTTP 200だけですか? – Pytry

答えて

0

に役立ちます。すべてのケースで、マルチパートデータの唯一のタイプは "multipart/form-data:"であると仮定しているため、リクエストのマルチパート性を再確認しません。

org.springframework.http.converter.FormHttpMessageConverter:lines 247 -272

@Override 
@SuppressWarnings("unchecked") 
public void write(MultiValueMap<String, ?> map, MediaType contentType, HttpOutputMessage outputMessage) 
     throws IOException, HttpMessageNotWritableException { 

    if (!isMultipart(map, contentType)) { 
     writeForm((MultiValueMap<String, String>) map, contentType, outputMessage); 
    } 
    else { 
     writeMultipart((MultiValueMap<String, Object>) map, outputMessage); 
    } 
} 


private boolean isMultipart(MultiValueMap<String, ?> map, MediaType contentType) { 
    if (contentType != null) { 
     return MediaType.MULTIPART_FORM_DATA.includes(contentType); 
    } 
    for (String name : map.keySet()) { 
     for (Object value : map.get(name)) { 
      if (value != null && !(value instanceof String)) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

あなたはプライベートメソッド「isMultipart」の最初の部分を見れば、あなたはこの表示されます。

if (contentType != null) { 
     return MediaType.MULTIPART_FORM_DATA.includes(contentType); 
    } 

をそれでは、multipart/form-data」と宣言しているかどうかを確認します"あなたのものは"マルチパート/混合 "なので、失敗します。

他にも失敗する可能性がある点がいくつかありますが、それが問題の根本です。

RestTemplateを使用したい場合は、目的のメディアタイプを認識する独自のメッセージコンバータを実装し、それをテンプレートメッセージコンバータに追加するだけです。

また、それを拡張コピー&ペーストして変更、またはアパッチHttpClientを(あるいは、コアJava私は仮定)のような、もう少し基本的なものを使用して最初からクライアントを作成することにより、RestTemplateの独自のバリエーションを書くことができます。

+0

説明と入力をありがとう、RestTemplateの独自のHttpClientバリエーションを作成しました。 – fastlearner

+0

これをオーバーライドせずに解決する方法がないので、これを答えとして受け入れます。 – fastlearner

+0

私は助けることができる嬉しい:) – Pytry

関連する問題