Skip to content

Commit 8d9f1b3

Browse files
committed
BambooRequest添加request body属性
1 parent 4eafa5b commit 8d9f1b3

File tree

9 files changed

+131
-6
lines changed

9 files changed

+131
-6
lines changed

spring-cloud-bamboo/src/main/java/cn/springcloud/bamboo/BambooRequest.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,18 @@ public class BambooRequest {
1212
private final String ip;
1313
private final MultiValueMap<String, String> params;
1414
private final MultiValueMap<String, String> headers;
15+
private final RequestBody requestBody;
1516

1617

17-
private BambooRequest(String uri, String serviceId, String ip, MultiValueMap<String, String> params, MultiValueMap<String, String> headers) {
18+
private BambooRequest(
19+
String uri, String serviceId, String ip, MultiValueMap<String, String> params,
20+
MultiValueMap<String, String> headers, RequestBody requestBody) {
1821
this.uri = uri;
1922
this.serviceId = serviceId;
2023
this.params = params;
2124
this.headers = headers;
2225
this.ip = ip;
26+
this.requestBody = requestBody;
2327

2428
}
2529

@@ -34,6 +38,7 @@ public static class Builder{
3438
private String ip;
3539
private MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
3640
private MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
41+
private RequestBody requestBody;
3742
private Builder(){
3843

3944
}
@@ -107,9 +112,19 @@ public Builder addHeader(String key, String value){
107112
return this;
108113
}
109114

115+
public Builder requestBody(RequestBody requestBody){
116+
this.requestBody = requestBody;
117+
return this;
118+
}
119+
120+
public Builder requestBody(byte[] body){
121+
this.requestBody = new BytesRequestBody(body);
122+
return this;
123+
}
124+
110125

111126
public BambooRequest build() {
112-
return new BambooRequest(uri, serviceId, ip, params, headers);
127+
return new BambooRequest(uri, serviceId, ip, params, headers, requestBody);
113128
}
114129
}
115130

@@ -137,4 +152,8 @@ public MultiValueMap<String, String> getHeaders() {
137152
public String getIp() {
138153
return ip;
139154
}
155+
156+
public RequestBody getRequestBody() {
157+
return requestBody;
158+
}
140159
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package cn.springcloud.bamboo;
2+
3+
import java.io.UnsupportedEncodingException;
4+
5+
public class BytesRequestBody implements RequestBody{
6+
7+
private static final String DEFAULT_CHARSET = "UTF-8";
8+
9+
private byte[] body;
10+
11+
public BytesRequestBody(byte[] body) {
12+
this.body = body;
13+
}
14+
15+
@Override
16+
public byte[] getBody() {
17+
return body;
18+
}
19+
20+
@Override
21+
public String getBodyString() {
22+
return getBodyString(DEFAULT_CHARSET);
23+
}
24+
25+
@Override
26+
public String getBodyString(String charset) {
27+
try {
28+
return new String(body, charset);
29+
}catch (UnsupportedEncodingException e){
30+
throw new RuntimeException(e.getMessage(), e);
31+
}
32+
}
33+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package cn.springcloud.bamboo;
2+
3+
public interface RequestBody {
4+
5+
6+
7+
byte[] getBody();
8+
9+
String getBodyString();
10+
11+
String getBodyString(String charset);
12+
}

spring-cloud-bamboo/src/main/java/cn/springcloud/bamboo/feign/BambooFeignClient.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ public Response execute(Request request, Request.Options options) throws IOExcep
3131
.serviceId(uri.getHost())
3232
.uri(uri.getPath())
3333
.ip(RequestIpKeeper.getRequestIp())
34-
.addMultiParams(WebUtils.getQueryParams(uri.getQuery()));
34+
.addMultiParams(WebUtils.getQueryParams(uri.getQuery()))
35+
.requestBody(request.body());
3536

3637
request.headers().entrySet().forEach(entry ->{
3738
for (String v : entry.getValue()) {

spring-cloud-bamboo/src/main/java/cn/springcloud/bamboo/ribbon/BambooClientHttpRequestIntercptor.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttp
2828
.ip(RequestIpKeeper.getRequestIp())
2929
.addMultiHeaders(request.getHeaders())
3030
.addMultiParams(WebUtils.getQueryParams(uri.getQuery()))
31+
.requestBody(body)
3132
.build();
3233

3334
ConnectPointContext connectPointContext = ConnectPointContext.builder().bambooRequest(bambooRequest).build();

spring-cloud-bamboo/src/main/java/cn/springcloud/bamboo/zuul/filter/BambooPreZuulFilter.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,23 @@
66
import com.netflix.util.Pair;
77
import com.netflix.zuul.ZuulFilter;
88
import com.netflix.zuul.context.RequestContext;
9+
import org.apache.commons.io.IOUtils;
10+
import org.slf4j.Logger;
11+
import org.slf4j.LoggerFactory;
912
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
1013

14+
import java.io.BufferedReader;
15+
import java.io.IOException;
16+
import java.io.InputStreamReader;
1117
import java.util.stream.Collectors;
1218

1319
/**
1420
* 主要作用是用来获取request的相关信息,为后面的路由提供数据基础。
1521
*/
1622
public class BambooPreZuulFilter extends ZuulFilter {
23+
24+
private static final Logger log = LoggerFactory.getLogger(BambooPreZuulFilter.class);
25+
1726
@Override
1827
public String filterType() {
1928
return FilterConstants.PRE_TYPE;
@@ -41,6 +50,16 @@ public Object run() {
4150
.addHeaders(context.getOriginResponseHeaders().stream().collect(Collectors.toMap(Pair::first, Pair::second)));
4251
context.getOriginResponseHeaders().forEach(pair-> builder.addHeader(pair.first(), pair.second()));
4352

53+
try {
54+
BufferedReader reader = new BufferedReader(new InputStreamReader(context.getRequest().getInputStream()));
55+
byte[] reqBody = IOUtils.toByteArray(reader);
56+
builder.requestBody(reqBody);
57+
}catch (IOException e){
58+
String errorMsg = "获取request body出现异常";
59+
log.error(errorMsg, e);
60+
throw new RuntimeException(errorMsg, e);
61+
}
62+
4463
ConnectPointContext connectPointContext = ConnectPointContext.builder().bambooRequest(builder.build()).build();
4564

4665
BambooAppContext.getBambooRibbonConnectionPoint().executeConnectPoint(connectPointContext);

spring-cloud-mult-version-samples/spring-cloud-bamboo-service-a-samples/src/main/java/cn/springcloud/bamboo/service/a/web/rest/TestResource.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,12 @@ public Map<String, String> testGet(@RequestParam(value = "version", required = f
2424
}
2525

2626

27+
@RequestMapping(value = "/post", method = RequestMethod.POST)
28+
@ResponseBody
29+
public Map<String, String> testPost(@RequestParam(value = "version", required = false) String version, @RequestBody String body) {
30+
return ImmutableMap.of(
31+
"test", "success.", "version", StringUtils.defaultIfEmpty(version, ""),
32+
"serverPort", env.getProperty("server.port"), "body", body);
33+
}
34+
2735
}

spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/b/feign/TestClient.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package cn.springcloud.bamboo.service.b.feign;
22

33
import org.springframework.cloud.netflix.feign.FeignClient;
4-
import org.springframework.web.bind.annotation.RequestMapping;
5-
import org.springframework.web.bind.annotation.RequestMethod;
6-
import org.springframework.web.bind.annotation.RequestParam;
4+
import org.springframework.web.bind.annotation.*;
75

86
import java.util.Map;
97

@@ -16,4 +14,9 @@ public interface TestClient {
1614
@RequestMapping(path = "/api/test/get", method = RequestMethod.GET)
1715
Map<String, String> testGet(@RequestParam(value = "version", required = false) String version);
1816

17+
18+
19+
@RequestMapping(value = "/api/test/post", method = RequestMethod.POST)
20+
Map<String, String> testPost(@RequestParam(value = "version") String version, @RequestBody String body);
21+
1922
}

spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/b/rest/TestResource.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,35 @@ public Map<String, Object> restTemplateGet(HttpServletRequest request) {
4141
}
4242

4343

44+
/**
45+
* test feign invoke service-a
46+
*
47+
* @param version 请求版本
48+
* @return 消息体
49+
*/
50+
@RequestMapping(value = "/feignPost", method = RequestMethod.POST)
51+
@ResponseBody
52+
public Map<String, Object> feignPost(@RequestParam(value = "version", required = false) String version, @RequestBody String body) {
53+
Map map = testClient.testPost(version, body);
54+
return ImmutableMap.of("feignPost", "success.", "service-a-result", map);
55+
}
56+
57+
58+
/**
59+
* test feign invoke service-a
60+
*
61+
* @param version 请求版本
62+
* @return 消息体
63+
*/
64+
@RequestMapping(value = "/restTemplatePost", method = RequestMethod.POST)
65+
@ResponseBody
66+
public Map<String, Object> restTemplatePost(@RequestParam(value = "version", required = false) String version, @RequestBody String body) {
67+
String url = "http://service-a/api/test/post?version="+version;
68+
Map map = restTemplate.postForObject(url, body, Map.class);
69+
return ImmutableMap.of("restTemplatePost", "success.", "service-a-result", map);
70+
}
71+
72+
4473
/**
4574
* test feign invoke service-a
4675
*

0 commit comments

Comments
 (0)