一、前言
最近带着两个兄弟做支付宝小程序后端相关的开发,小程序首页涉及到很多查询的服务。小程序后端服务在我司属于互联网域,相关的查询服务已经在核心域存在了,查询这块所要做的工作就是做接口中转。参考了微信小程序的代码,发现他们要么新写一个接口调用,要么新写一个接口包裹多个接口调用。这种方式不容易扩展。由于开发周期比较理想,所以决定设计一个接口中转器。
二、接口中转器整体设计
三、接口中转器核心Bean
@Bean public SimpleUrlHandlerMapping directUrlHandlerMapping(@Autowired RequestMappingHandlerAdapter handlerAdapter , ObjectProvider<List<IDirectUrlProcessor>> directUrlProcessorsProvider) { List<IDirectUrlProcessor> directUrlProcessors = directUrlProcessorsProvider.getIfAvailable(); Assert.notEmpty(directUrlProcessors, "接口直达解析器(IDirectUrlProcessor)列表不能为空!!!"); SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping(); Map<String, Controller> urlMappings = Maps.newHashMap(); urlMappings.put("/alipay-applet/direct/**", new AbstractController() { @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { for (IDirectUrlProcessor directUrlProcessor : directUrlProcessors) { if (directUrlProcessor.support(request)) { String accept = request.getHeader("Accept"); request.setAttribute(PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE, Sets.newHashSet(MediaType.APPLICATION_JSON_UTF8)); if (StringUtils.isNotBlank(accept) && !accept.contains(MediaType.ALL_VALUE)) { request.setAttribute(PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE, Sets.newHashSet( Arrays.stream(accept.split(",")) .map(value -> MediaType.parseMediaType(value.trim())) .toArray(size -> new MediaType[size]) )); } HandlerMethod handlerMethod = new HandlerMethod(directUrlProcessor, ReflectionUtils.findMethod(IDirectUrlProcessor.class, "handle", HttpServletRequest.class)); return handlerAdapter.handle(request, response, handlerMethod); } } throw new RuntimeException("未找到具体的接口直达处理器..."); } }); mapping.setUrlMap(urlMappings); mapping.setOrder(Ordered.HIGHEST_PRECEDENCE + 1); return mapping; }
关于核心Bean的示意如下。
- 使用S