知識庫 / Spring / Spring Cloud RSS 訂閱

使用 Spring Cloud Feign 發送 URL 編碼的數據表單

Spring Cloud
HongKong
10
11:42 AM · Dec 06 ,2025

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

讓我們驗證我們的代碼,請求體應包含 idname 作為 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請求。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.