gpt4 book ai didi

java - 如何使用 zuul 过滤器转换客户端请求主体?

转载 作者:行者123 更新时间:2023-11-30 07:56:42 25 4
gpt4 key购买 nike

我想使用 Zuul 来验证、转换和转发来自客户端的请求到内部服务。目标是向客户端隐藏遗留 API。

我的想法是:客户端将带有对象 A 的 JSON 表示的 POST 请求发送到嵌入了 Zuul 的 API 网关。 API 网关将正文从 A 转换为 LegacyA,并将其发送到内部服务。

例如,我搜索了一种转换以下JSON的方法:

["hello","world"]

在这个 JSON 中:

{hashCode("hello"):"hello", hashCode("world"):"world")}

我想使用前置过滤器。但是我在重写有效请求时遇到问题。

你知道我该怎么做吗?

我写了这个过滤器:

public class RestZuulFilter extends ZuulFilter {

private final ObjectMapper objectMapper;

@Autowired
public RestZuulFilter(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}

@Override
public String filterType() {
return "pre";
}

@Override
public int filterOrder() {
return 100;
}

@Override
public boolean shouldFilter() {
return true;
}

@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();

HttpServletRequestWrapper wrapper = new MyWrapper(ctx.getRequest());
ctx.setRequest(wrapper);

return null;
}

class MyWrapper extends HttpServletRequestWrapper {

/**
* Constructs a request object wrapping the given request.
*
* @param request The request to wrap
* @throws IllegalArgumentException if the request is null
*/
public MyWrapper(HttpServletRequest request) {
super(request);
}

@Override
public ServletInputStream getInputStream() throws IOException {
ServletInputStream inputStream = this.getRequest().getInputStream();

List<String> test = objectMapper.readValue(inputStream, new TypeReference<List<String>>() {
});
Map<Integer, String> result = test.stream()
.collect(Collectors.toMap(String::hashCode, str -> str));

byte[] json = objectMapper.writeValueAsBytes(result);
ServletInputStream response = new ServletInputStreamWrapper(json);

return response;
}
}
}

我遇到的问题是 Content-Length 没有相应更新。

最佳答案

查看以下正在转换的请求正文示例。我想这应该适合你。

    InputStream in = (InputStream) context.get("requestEntity");
if (in == null) {
in = context.getRequest().getInputStream();
}
String body = StreamUtils.copyToString(in, Charset.forName("UTF-8"));
body = body.toUpperCase();
context.set("requestEntity", new ByteArrayInputStream(body.getBytes("UTF-8")));

对于完整的类:

https://github.com/spring-cloud-samples/sample-zuul-filters/blob/master/src/main/java/org/springframework/cloud/samplezuulfilters/UppercaseRequestEntityFilter.java

关于java - 如何使用 zuul 过滤器转换客户端请求主体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41896886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com