文章目录
前言
公司WMS系统与ERP系统、MES系统作对接
需要开放WMS系统接口,暂时没有做安全验证,直接跳过shirFilter验证
提示:以下是本篇文章正文内容,下面案例可供参考
一、WMS系统开放接口
1.ShiroConfig中添加需要开放的接口 filterMap.put("/api/base/**", “anon”)
- filterMap.put("/api/base/**", “anon”)——会放开api/base/下面所有的接口,不进入验证
代码如下(示例):
/**
* @ClassName ShiroConfig
* @Description TODO
* @Author Gao
* @Date 2021/11/16 16:06
* @Version 1.0
**/
@Configuration
public class ShiroConfig {
@Bean
public DefaultWebSessionManager sessionManager(){
DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
sessionManager.setSessionValidationSchedulerEnabled(false);
sessionManager.setSessionIdUrlRewritingEnabled(false);
return sessionManager;
}
@Bean("securityManager")
public SecurityManager securityManager(Oauth2Realm oAuth2Realm, SessionManager sessionManager) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(oAuth2Realm);
securityManager.setSessionManager(sessionManager);
securityManager.setRememberMeManager(null);
return securityManager;
}
@Bean("shiroFilter")
public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
shiroFilter.setSecurityManager(securityManager);
//oauth过滤
Map<String, Filter> filters = new HashMap<>();
filters.put("oauth2", new Oauth2Filter());
shiroFilter.setFilters(filters);
Map<String, String> filterMap = new LinkedHashMap<>();
filterMap.put("/webjars/**", "anon");
filterMap.put("/druid/**", "anon");
filterMap.put("/login", "anon");
filterMap.put("/swagger/**", "anon");
filterMap.put("/v2/api-docs", "anon");
filterMap.put("/doc.html", "anon");
filterMap.put("/swagger-resources/**", "anon");
filterMap.put("/modeler/**", "anon");
filterMap.put("/flowable/**", "anon");
filterMap.put("/app/rest/**", "anon");
filterMap.put("/views/**", "anon");
filterMap.put("/captcha", "anon");
filterMap.put("/favicon.ico", "anon");
filterMap.put("/ureport/**", "anon");
filterMap.put("/pay/alipay/**", "anon");
filterMap.put("/api/base/**", "anon");
filterMap.put("/api/in/**", "anon");
filterMap.put("/api/out/**", "anon");
filterMap.put("/**", "oauth2");
shiroFilter.setFilterChainDefinitionMap(filterMap);
return shiroFilter;
}
@Bean("lifecycleBeanPostProcessor")
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager);
return advisor;
}
}
2.对外开放接口层
- @RequestMapping(“api/base”) 对应 filterMap.put("/api/base/**", “anon”)
代码如下(示例):
/**
* @ClassName WmsAdminApiController
* @Description Api开放接口:物料模块 TODO 1,暂时没有考虑安全问题 2,数据对接字段等还需要做进一步确定
* @Author Gao
* @Date 2021/11/16 17:02
* @Version 1.0
**/
@RestController
@RequestMapping("api/base")
@Api(tags = "Api:仓库模块")
public class ApiMaterialController {
@Autowired
private MaterialCategoryService materialCategoryService;
@Autowired
private ApiMaterialService apiMaterialService;
@PostMapping("/saveMaterial")
@ApiOperation("新增物料")
@LogOperation("新增物料")
public Result saveMaterial(@RequestBody ApiMaterialDto dto) {
ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class);
String materialCategoryName = materialCategoryService.getMaterialCategoryNameByCode(dto.getMaterialCategoryCode());
String code = OrderNoSerialUtil.generateCode(OrderTypeEnum.物料编码);
dto.setCode(code);
dto.setMaterialCategoryName(materialCategoryName);
apiMaterialService.save(dto);
return new Result();
}
@PutMapping("/updateMaterial")
@ApiOperation("修改物料")
@LogOperation("修改物料")
public Result updateMaterial(@RequestBody ApiMaterialDto dto) {
ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class);
if (null != dto.getId()) {
String materialCategoryName = materialCategoryService.getMaterialCategoryNameByCode(dto.getMaterialCategoryCode());
dto.setMaterialCategoryName(materialCategoryName);
apiMaterialService.update(dto);
return new Result();
}
return new Result().error("修改物料失败");
}
@GetMapping("/getMaterialInfo/{id}")
@ApiOperation("获取物料详细信息")
public ApiMaterialDto getMaterialInfo(@PathVariable("id") Long id) {
ApiMaterialDto data = apiMaterialService.get(id);
return data;
}
}
二、测试工程来获取WMS系统对外开放接口数据
1.DTO传输层
- 需要接收的数据需要对应上
代码如下(示例):
/**
* @ClassName MaterialDTO
* @Description TODO
* @Author 码头土夫子_Gao
* @Date 2021/11/16 10:03
* @Version 1.0
**/
@Data
public class MaterialDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String auxprop;
private String basicUnit;
private String code;
private String color;
private Integer enableStatus;
private String name;
private String producingArea;
private String materialCategoryCode;
private String materialCategoryName;
private String specifications;
private String supplierCode;
private String supplierName;
private BigDecimal volume;
private String warehouseCode;
private String commodityCode;
private BigDecimal weight;
private Long creator;
private String creatorName;
}
2.测试类
- 使用Spingboot封装好的RestTemplate来获取外部接口数据
代码如下(示例):
/**
* @ClassName Get
* @Description TODO
* @Author 码头土夫子_Gao
* @Date 2021/11/18 14:49
* @Version 1.0
**/
public class Get {
RestTemplate restTemplate = new RestTemplate();
@Test
public void TestDoGet() {
//本地对外开放得接口
String url = "http://localhost:8081/njp-wms-api/api/base/getMaterialInfo/1458624486038405121";
MaterialDTO data = restTemplate.getForObject(url, MaterialDTO.class);
System.out.println("查询物料返回结果:" + data);
}
}
3.测试结果
总结
上述内容,讲述了如何开放系统接口,不进入验证,第三方如何获取开放接口的数据
关于安全问题,后续会进一步更新