我正在参加「掘金·启航计划」
1. 背景
最近自己的SpringCloud项目接入了微信支付,那么当然也少不了spring GateWay这一个网关层了。接入他的原因是为了拆分流量。纯属就是技术上的要求,需要网关帮助应用减少项目。在调试微信支付的时候,大家应该都知道,用户支付以后微信会回调你填写的回调接口,以便通知商家用户完成了支付,可以继续处理对应的业务了。本来在不接入Spring GateWay的时候可以正常回调,但是用到了网关以后发现就回调失败了。
2. 案件复现
可以看到我写了一个post接口当做微信的回调接口,这个接口比较特殊的是他不是传统的json格式交互。而是以参数的形式将对应参数和值传给我们。
在测试过程中发现一直没有调用我的接口,由于是网关层去分发的调用哪个runtime。网关层的日志一直打印404。很显然就是没有找到我的接口。那么为什么呢会这样呢?一般来说就是spring GateWay的路由有问题。
3. 解决方案
解决方案:当识别到路径为特定路径时,直接转发到对应的runtime上处理即可解决。
-
- 自定义RoutesConfig文件
- 重新定一个RouteLocator的bean
代码的代码如下:
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
// 解决POST请求,BODY内容体为空,抛404错误。。
.route(r -> r.method(HttpMethod.POST).or().method(HttpMethod.GET).and()
.path("/xxx/jsapi/refundTransaction", "/xxx/app/refundTransaction",
"/xxx/jsapi/transaction", "/xxx/app/transaction", "/xxx/alipay/transaction")
.uri("lb://xxxx-xxx-runtime"))
.build();
}
什么意思呢?
我们自定义个route,当请求方法是POST或者是GET时,并且路径跟我们想要的路径一直时。我们转发到自定义的runtime上。实现接口的调用。
4. 思考
在接入对应新的技术时,可能会配上一些以前没有见过的问题。要自己尝试着去百度、去翻资料解决。可以多尝试,试错的成本花费了时间,但是总会有收获的。并且把对应的记录下来。