http-client的使用方式

words: 1.3k    time: 7min    views:

主要演示一下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.java
1
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.java
1
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中获取服务对应的地址

HttpServiceChooser
1
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.java
1
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.java
1
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.java
1
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.java
1
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.java
1
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.java
1
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);
}
https://github.com/cowave5/http-client/blob/master/src/test/java/com/cowave/commons/client/http/head/HeadMockService.java
1
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.java
1
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.java
1
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.java
1
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.java
1
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.java
1
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