福哥需要在Java里面去请求其他服务器的接口,找了半天决定使用WebClient这个对象来实现。
模拟用户的GET请求操作,这里面最CD的是拼凑GET请求的QueryString的问题。
如果你直接通过字符串拼接的方式把QueryString组织好拼到url后面,那么你就会发现如果QueryString的参数的值包含“?”、“&”、“=”这样的特殊字符的话,服务器端收到的QueryString就会乱套了。
如果你将QueryString里面的参数的值使用UrlEncode编码之后再拼接到url后面,那么你就会发现服务器端收到的QueryString是经过UrlEncode编码过的。
终极解决方案,看福哥的代码
String resp;
Mono<String> monoResp;
WebClient webClient;
String queryString;
webClient = WebClient.create();
queryString = "";
for(Map.Entry<String, String> entry : params.entrySet()){
queryString += "&"+entry.getKey()+"={"+ entry.getKey() +"}";
}
if(!url.contains("?")){
url += "?"+queryString.substring(1);
}
else{
url += queryString;
}
monoResp = webClient.get()
.uri(url, params)
.retrieve()
.bodyToMono(String.class);
resp = monoResp.block();
return resp;模拟用户的POST请求操作,这里面最大的问题还是传递参数的问题。
经过福哥的各种踩坑之后,得到了终极解决方案,就是使用BodyInserters.fromFormData将MultiValueMap转换后传递给body方法。
String resp;
Mono<String> monoResp;
WebClient webClient;
MultiValueMap<String, String> myParams = new LinkedMultiValueMap<>();
webClient = WebClient.create();
for(Map.Entry<String, String> entry : params.entrySet()){
myParams.add(entry.getKey(), entry.getValue());
}
monoResp = webClient.post()
.uri(url)
.body(BodyInserters.fromFormData(myParams))
.retrieve()
.bodyToMono(String.class);
resp = monoResp.block();
return resp;我们建立一个测试控制器,写下如下代码,分别测试通过GET方式和POST方式请求接口的效果。
@RequestMapping("/net.tongfu.tfjava.test.httpclient")
public String responseTestHttpClient(
) {
TFHttpClient httpClient = new TFHttpClient();
Map<String, String> params = new HashMap<>();
params.put("title", "福哥辛苦了!");
params.put("content", "福哥加油哦~~");
String a = httpClient.Get("http://192.168.1.113:8070/TFRouteMap.php", params);
String b = httpClient.Post("http://192.168.1.113:8070/TFRouteMap.php", params);
return "httpClient.Get:\n"+a+"\nhttpClient.Post:\n"+b;
}
使用WebClient对象可以轻松完成HTTP的GET请求或者POST请求。