1. 概述
在本教程中,我們將學習如何使用 Feign 客户端將 form-url-encoded 數據作為請求體中的 POST API 請求。
2. 通過 POST form-url-encoded 數據
有兩的不同方法可以發送 POST 請求,傳輸 form-url-encoded 數據。首先,我們需要創建一個自定義編碼器並將其配置到我們的 Feign 客户端中:
class FormFeignEncoderConfig {
@Bean
public Encoder encoder(ObjectFactory<HttpMessageConverters> converters) {
return new SpringFormEncoder(new SpringEncoder(converters));
}
}我們將在我們的 Feign 客户端配置中使用這個自定義類:
@FeignClient(name = "form-client", url = "http://localhost:8085/api",
configuration = FormFeignEncoderConfig.class)
public interface FormClient {
// request methods
}我們已經完成了 Feign 和 Bean 的配置。現在讓我們來查看請求方法。
2.1. 使用POJO
我們將創建一個Java POJO類,其中包含所有表單參數作為成員:
public class FormData {
int id;
String name;
// constructors, getters and setters
}我們將此對象作為 POST 請求的請求體(request body)傳遞。
@PostMapping(value = "/form", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
void postFormData(@RequestBody FormData data);讓我們驗證我們的代碼,請求體應包含 id 和 name 作為 form-url-encoded 格式的數據:
@Test
public void givenFormData_whenPostFormDataCalled_thenReturnSuccess() {
FormData formData = new FormData(1, "baeldung");
stubFor(WireMock.post(urlEqualTo("/api/form"))
.willReturn(aResponse().withStatus(HttpStatus.OK.value())));
formClient.postFormData(formData);
wireMockServer.verify(postRequestedFor(urlPathEqualTo("/api/form"))
.withHeader("Content-Type", equalTo("application/x-www-form-urlencoded; charset=UTF-8"))
.withRequestBody(equalTo("name=baeldung&id=1")));
}2.2. 使用 Map
我們可以使用 Map 而不是 POJO 類來在 POST 請求的請求體中發送 form-url-encoded 數據。
@PostMapping(value = "/form/map", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
void postFormMapData(Map<String, ?> data);請注意,Map 的值應為 ‘?’。
讓我們驗證我們的代碼:
@Test
public void givenFormMap_whenPostFormMapDataCalled_thenReturnSuccess() {
Map<String, String> mapData = new HashMap<>();
mapData.put("name", "baeldung");
mapData.put("id", "1");
stubFor(WireMock.post(urlEqualTo("/api/form/map"))
.willReturn(aResponse().withStatus(HttpStatus.OK.value())));
formClient.postFormMapData(mapData);
wireMockServer.verify(postRequestedFor(urlPathEqualTo("/api/form/map"))
.withHeader("Content-Type", equalTo("application/x-www-form-urlencoded; charset=UTF-8"))
.withRequestBody(equalTo("name=baeldung&id=1")));
}3. 結論
在本文中,我們學習瞭如何使用form-url-encoded數據在請求體中進行POST API請求。