如何使用Jersey Client模拟发送携带MultivaluedMap作为表单数据的POST请求
MultivaluedMap作为表单数据发送POST请求的实现方案
MultivaluedMap是JAX-RS规范中定义的多值映射结构,原生支持作为application/x-www-form-urlencoded类型的表单参数提交,不同工具栈的实现方式如下:
1. JAX-RS 原生客户端(Jersey/RESTEasy)
这类框架原生支持MultivaluedMap作为表单入参,构造完成后直接传入请求实体即可:
import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Entity; import javax.ws.rs.core.MultivaluedHashMap; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; // 构造表单数据,旧版本Jersey也可使用MultivaluedMapImpl MultivaluedMap<String, String> formData = new MultivaluedHashMap<>(); formData.add(FRIENDLY_NAME, tenDlcRegistration.getSiteName()); formData.add(EMAIL, notificationEmail); formData.add(POLICY_SID, policySid); // 发送POST请求 Client client = ClientBuilder.newClient(); Response response = client.target("目标接口地址") .request() .post(Entity.form(formData));
2. Apache HttpClient
需要先将MultivaluedMap转换为HttpClient要求的NameValuePair列表:
import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import java.util.ArrayList; import java.util.List; import java.util.Map; // MultivaluedMap转NameValuePair列表 List<NameValuePair> params = new ArrayList<>(); for (Map.Entry<String, List<String>> entry : formData.entrySet()) { String key = entry.getKey(); for (String value : entry.getValue()) { params.add(new BasicNameValuePair(key, value)); } } // 执行请求 try (CloseableHttpClient httpClient = HttpClients.createDefault()) { HttpPost httpPost = new HttpPost("目标接口地址"); httpPost.setEntity(new UrlEncodedFormEntity(params)); httpClient.execute(httpPost); } catch (Exception e) { e.printStackTrace(); }
3. Spring RestTemplate
需要先将JAX-RS的MultivaluedMap转换为Spring自带的MultiValueMap结构:
import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import java.util.Map; // 转换为Spring的MultiValueMap MultiValueMap<String, String> springFormData = new LinkedMultiValueMap<>(); for (Map.Entry<String, List<String>> entry : formData.entrySet()) { springFormData.addAll(entry.getKey(), entry.getValue()); } // 执行请求 RestTemplate restTemplate = new RestTemplate(); String result = restTemplate.postForObject("目标接口地址", springFormData, String.class);
以上所有实现都会自动添加
Content-Type: application/x-www-form-urlencoded请求头,无需手动配置。如果接口需要鉴权、自定义请求头等参数,在请求构造阶段自行添加即可。
内容的提问来源于stack exchange,提问作者Polavarapu Rajasekhar
相关产品推荐
相关产品推荐

