0

私はRESTfull Webサービスリソースを呼び出そうとしています。このリソースはサードパーティによって提供され、リソースはOPTIONS http動詞で公開されています。Spring restテンプレートを使用してbodyでHTTP OPTIONSリクエストを送信するには?

サービスと統合するには、特定の身分でリクエストを送信する必要があります。特定の身分はプロバイダーによって識別されますが、その際には不正なリクエストがあります。その後、私は私のコードをトレースし、私は、要求の本体を次のコードに基づいて、残りのテンプレートでは無視されていることを認識:

if ("POST".equals(httpMethod) || "PUT".equals(httpMethod) || 
      "PATCH".equals(httpMethod) || "DELETE".equals(httpMethod)) { 
     connection.setDoOutput(true); 
    } 
    else { 
     connection.setDoOutput(false); 
    } 

私の質問に、この動作を無効にするための標準的な方法があるか、私は別のものを使用する必要がありますツール?

答えて

1

あなたが貼り付けられたコードは、私は数時間前にそのコードをデバッグしてきたので、私は知っている

SimpleClientHttpRequestFactory.prepareConnection(HttpURLConnection connection, String httpMethod) 

からです。 restTemplateを使用してbodyでHTTP GETを実行する必要がありました。そこでSimpleClientHttpRequestFactoryを拡張し、prepareConnectionをオーバーライドし、新しいファクトリを使用して新しいRestTemplateを作成しました。

public class SimpleClientHttpRequestWithGetBodyFactory extends SimpleClientHttpRequestFactory { 

@Override 
protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException { 
    super.prepareConnection(connection, httpMethod); 
    if ("GET".equals(httpMethod)) { 
     connection.setDoOutput(true); 
    } 
} 

}

(春ブーツ(@RunWith(SpringRunner.class) @SpringBootTestを使用して作業しているこの工場

new RestTemplate(new SimpleClientHttpRequestWithGetBodyFactory()); 

ソリューションを証明するためのテストに基づいて新しいRestTemplateを作成します。 webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT))

public class TestRestTemplateTests extends AbstractIntegrationTests { 

@Test 
public void testMethod() { 
    RestTemplate restTemplate = new RestTemplate(new SimpleClientHttpRequestWithBodyForGetFactory()); 

    HttpEntity<String> requestEntity = new HttpEntity<>("expected body"); 

    ResponseEntity<String> responseEntity = restTemplate.exchange("http://localhost:18181/test", HttpMethod.GET, requestEntity, String.class); 
    assertThat(responseEntity.getBody()).isEqualTo(requestEntity.getBody()); 
} 

@Controller("/test") 
static class TestController { 

    @RequestMapping 
    public @ResponseBody String testMethod(HttpServletRequest request) throws IOException { 
     return request.getReader().readLine(); 
    } 
} 

}

+0

httpMethod = OPTIONSのconnection.setDoOutput(true)を使用して、同じ派生SimpleClientHttpRequestWithGetBodyFactoryを再テストしました。残りのテンプレートが投げています:org.springframework.web.client.ResourceAccessException: "http:// localhost:18181/test"のOPTIONSリクエストでI/Oエラーが発生しました:HTTPメソッドOPTIONSは出力をサポートしていません。ネストされた例外はjava.net.ProtocolExceptionです:HTTPメソッドOPTIONSは出力をサポートしていません。これは、Optionsにconnection.setDoOutput(false)がある理由です。 –

関連する問題