0

Я пытаюсь вызвать ресурс веб-службы RESTfull, этот ресурс предоставляется третьей стороной, ресурс открывается с помощью OPTIONS http verb.Как отправить запрос HTTP OPTIONS с телом, используя шаблон Spring rest?

Чтобы интегрироваться с сервисом, я должен отправить запрос с определенным телом, который идентифицирует провайдер, но когда я сделал это, у меня возникли плохие запросы. После этого я могу отследить свой код, то я узнал, что тело запроса игнорируется остальной шаблон основан на коде ниже:

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) 

Я знаю, потому что я отлажена этот код несколько часов назад. Мне нужно было сделать HTTP GET с телом, используя restTemplate. Таким образом, я расширяю 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); 
    } 
} 

}

Создать новое RestTemplate основанного на этом заводе

new RestTemplate(new SimpleClientHttpRequestWithGetBodyFactory()); 

тест, чтобы доказать решение работает с использованием загрузочной пружины (@RunWith (SpringRunner.class) @SpringBootTest (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

Я проверил те же производные SimpleClientHttpRequestWithGetBodyFactory с connection.setDoOutput (true) для httpMethod = OPTIONS. Шаблон останова бросает: org.springframework.web.client.ResourceAccessException: ошибка ввода-вывода в запросе OPTIONS для «http: // localhost: 18181/test»: HTTP-метод OPTIONS не поддерживает вывод; Вложенное исключение - java.net.ProtocolException: HTTP-метод OPTIONS не поддерживает вывод. Так вот почему у параметров есть connection.setDoOutput (false); –

 Смежные вопросы

  • Нет связанных вопросов^_^