主要演示一下http-client的使用方式,基本与Feign差不多,做了一些简单扩展,具体示例可以参考对应的测试用例
<dependency>
<groupId>com.cowave.commons</groupId>
<artifactId>http-client</artifactId>
<version>2.7.5</version>
</dependency>
Get
@HttpClient指定url
https://github.com/cowave5/http-client/blob/master/src/test/java/com/cowave/commons/client/http/get/GetMockUrlService.java1 2 3 4 5 6 7 8 9 10
| @HttpClient(url = "http://127.0.0.1:8080") public interface GetMockUrlService {
@HttpHeaders({X_Request_ID + ": 12345"}) @HttpLine("GET /api/v1/get/{id}") HttpResponse<Object> getWithHttpParam(@HttpParam("id") Integer id);
@HttpLine("GET /api/v1/getByMap") HttpResponse<GetParam> getWithHttpParamMap(@HttpHeaderMap Map<String, Object> headMap, @HttpParamMap Map<String, Object> paramMap); }
|
@HttpClient指定服务name
https://github.com/cowave5/http-client/blob/master/src/test/java/com/cowave/commons/client/http/get/GetMockNameService.java1 2 3 4 5 6 7 8 9 10
| @HttpClient(name = "xxxService") public interface GetMockNameService {
@HttpHeaders({X_Request_ID + ": 12345"}) @HttpLine("GET /api/v1/get/{id}") HttpResponse<Object> getWithHttpParam(@HttpParam("id") Integer id);
@HttpLine("GET /api/v1/getByMap") HttpResponse<GetParam> getWithHttpParamMap(@HttpHeaderMap Map<String, Object> headMap, @HttpParamMap Map<String, Object> paramMap); }
|
如果通过注册服务名称调用的话,要实现一下接口HttpServiceChooser,可以从使用的注册服务提供的api中获取服务对应的地址
HttpServiceChooser1 2 3 4 5 6 7 8 9 10
| @Bean public HttpServiceChooser httpServiceChooser() { return name -> { if ("xxxService".equals(name)) { return "http://127.0.0.1:8080"; } else { return ""; } }; }
|
@HttpHost指定url
如果调用服务的地址只有在具体调用时才能确定,那么可以通过@HttpHost来指定
https://github.com/cowave5/http-client/blob/master/src/test/java/com/cowave/commons/client/http/get/GetMockHostService.java1 2 3 4 5 6 7 8 9 10 11
| @HttpClient public interface GetMockHostService {
@HttpHeaders({X_Request_ID + ": 12345"}) @HttpLine("GET /api/v1/get/{id}") HttpResponse<Object> getWithHttpParam(@HttpHost String httpUrl, @HttpParam("id") Integer id);
@HttpHeaders({X_Request_ID + ": {requestId}"}) @HttpLine("GET /api/v1/getByMap") HttpResponse<GetParam> getWithHttpParamMap(@HttpHost String httpUrl, @HttpParam("requestId") String requestId, @HttpParamMap Map<String, Object> map); }
|
Post
JacksonDecoder
对应响应,默认使用JacksonDecoder进行反序列化,可以使用HttpResponse来接收,或者有约定响应规范,可以定义对应的类型,比如Response
https://github.com/cowave5/http-client/blob/master/src/test/java/com/cowave/commons/client/http/post/PostMockService.java1 2 3 4 5 6 7 8 9
| @HttpClient(url = "http://127.0.0.1:8080") public interface PostMockService {
@HttpLine("POST /api/v1/create") HttpResponse<Object> create(Object body);
@HttpLine("POST /api/v1/create") Response<PostBody> create2(Map<String, Object> bodyMap); }
|
ResponseDecoder
如果响应使用的是这里约定的Response规范,那么使用ResponseDecoder可以省掉一些不必要判断检查
https://github.com/cowave5/http-client/blob/master/src/test/java/com/cowave/commons/client/http/post/PostMockDecodeService.java1 2 3 4 5 6
| @HttpClient(url = "http://127.0.0.1:8080", decoder = ResponseDecoder.class) public interface PostMockDecodeService {
@HttpLine("POST /api/v1/create") PostBody create(Map<String, Object> bodyMap); }
|
Patch
https://github.com/cowave5/http-client/blob/master/src/test/java/com/cowave/commons/client/http/patch/PatchMockService.java1 2 3 4 5 6
| @HttpClient(url = "http://127.0.0.1:8080") public interface PatchMockService {
@HttpLine("PATCH /api/v1/modify/{id}") HttpResponse<Object> modifyWithHttpParam(@HttpParam("id") Integer id, Map<String, Object> bodyMap); }
|
Put
https://github.com/cowave5/http-client/blob/master/src/test/java/com/cowave/commons/client/http/put/PutMockService.java1 2 3 4 5 6
| @HttpClient(url = "http://127.0.0.1:8080") public interface PutMockService {
@HttpLine("PUT /api/v1/put") HttpResponse<Object> put1(Map<String, Object> bodyMap); }
|
Delete
https://github.com/cowave5/http-client/blob/master/src/test/java/com/cowave/commons/client/http/delete/DeleteMockService.java1 2 3 4 5 6 7 8 9
| @HttpClient(url = "http://127.0.0.1:8080", decoder = ResponseDecoder.class) public interface DeleteMockService {
@HttpLine("DELETE /api/v1/del/{list}") Response.Page<Integer> batchDelete(@HttpParam("list") List<Integer> list);
@HttpLine("DELETE /api/v1/del") Response.Page<Integer> batchDelete2(@HttpParamMap Map<String, Object> paramMap); }
|
Head
https://github.com/cowave5/http-client/blob/master/src/test/java/com/cowave/commons/client/http/head/HeadMockService.java1 2 3 4 5 6
| @HttpClient(url = "http://127.0.0.1:8080") public interface HeadMockService {
@HttpLine("HEAD /api/v1/head") HttpResponse<Void> head(); }
|
Trace
https://github.com/cowave5/http-client/blob/master/src/test/java/com/cowave/commons/client/http/trace/TraceMockService.java1 2 3 4 5 6
| @HttpClient(url = "http://127.0.0.1:8080") public interface TraceMockService {
@HttpLine("TRACE /api/v1/trace") HttpResponse<String> trace(); }
|
Options
https://github.com/cowave5/http-client/blob/master/src/test/java/com/cowave/commons/client/http/options/OptionsMockService.java1 2 3 4 5 6
| @HttpClient(url = "http://127.0.0.1:8080") public interface OptionsMockService {
@HttpLine("OPTIONS /api/v1/options") HttpResponse<Void> options(); }
|
表单&上传文件
对于表单请求和上传文件也做了支持,但是上传文件体的参数类型只支持File、InputStream、byte[]
https://github.com/cowave5/http-client/blob/master/src/test/java/com/cowave/commons/client/http/multipart/MultiMockService.java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @HttpClient(url = "http://127.0.0.1:8080") public interface MultiMockService {
@HttpLine("POST /api/v1/submit") HttpResponse<Object> submit(@HttpMultiForm Map<String, Object> multiBody);
@HttpLine("POST /api/v1/submit") HttpResponse<Object> submitParam(@HttpMultiParam("id") Integer id, @HttpMultiParam("name") String name);
@HttpLine("POST /api/v1/submit2") HttpResponse<Object> submit2(@HttpMultiForm Map<String, Object> multiBody, @HttpMultiFile(fileName = "file") File file);
@HttpOptions(connectTimeout = 3000, readTimeout = 5000, retryTimes = 2, retryInterval = 3) @HttpLine("POST /api/v1/submit2") HttpResponse<Object> submit3(@HttpMultiForm Map<String, Object> multiBody, @HttpMultiFile(fileName = "file")InputStream inputStream);
@HttpLine("POST /api/v1/submit3") HttpResponse<Object> submit4(@HttpMultiForm Map<String, Object> multiBody, @HttpMultiFile(fileName = "testFile") byte[] bytes); }
|
下载请求
如果需要下载的话,只能使用HttpResponse来接收字节流,并且需要自己关闭Stream
https://github.com/cowave5/http-client/blob/master/src/test/java/com/cowave/commons/client/http/download/DownloadMockService.java1 2 3 4 5 6
| @HttpClient(url = "http://127.0.0.1:8080") public interface DownloadMockService {
@HttpLine("GET /api/v1/download") HttpResponse<InputStream> download(); }
|
Https请求
https请求的话,默认不作任何限制,可以自行指定一下SSLSocketFactory和HostnameVerifier
https://github.com/cowave5/http-client/blob/master/src/test/java/com/cowave/commons/client/http/https/HttpsMockService.java1 2 3 4 5 6 7 8
| @HttpClient(url = "https://127.0.0.1:8443") public interface HttpsMockService {
@HttpHeaders({X_Request_ID + ": 12345"}) @HttpLine("POST /api/v1/create") HttpResponse<Object> create(Map<String, Object> bodyMap);
}
|
参考:
Http规范:https://http.dev