java REST实现不同系统间接口调用

个人笔记:调用其他系统接口相关知识

RestTemplateClient 调用工具类:

@Component
public class RestTemplateClient {

//    @Autowired
//    private RestTemplate restTemplate;

    public JSONObject restTemplateByEntity (String url, Object entity){
        String resultInfo = "";

        RestTemplate restTemplate = new RestTemplate();
        this.changeCharset(restTemplate);

        HttpHeaders headers = new HttpHeaders();
        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
        headers.setContentType(type);
        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
        ObjectMapper objectMapper = new ObjectMapper();
        HttpEntity<String> Object = null;
        JSONObject jsonObject = null;
        try {
            // String resultInfo = restTemplate.getForObject(url, String.class, itemCode);

            Object = new HttpEntity<>(objectMapper.writeValueAsString(entity), headers);
            resultInfo = restTemplate.postForEntity(url, Object, String.class).getBody();
            jsonObject = JSONObject.parseObject(resultInfo);

        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return jsonObject;
    }

    public String restTemplateByEntityWithParam (String url, Object entity, Map<String, Object> map){
        String resultInfo = "";

        RestTemplate restTemplate = new RestTemplate();
        this.changeCharset(restTemplate);

        // 获取新ibus的头信息
        HttpHeaders headers = this.getNewIbusRestHeaders(map);

        ObjectMapper objectMapper = new ObjectMapper();
        HttpEntity<String> Object = null;
//        JSONObject jsonObject = null;
        try {
            // String resultInfo = restTemplate.getForObject(url, String.class, itemCode);

            Object = new HttpEntity<>(objectMapper.writeValueAsString(entity), headers);
            resultInfo = restTemplate.postForEntity(url, Object, String.class).getBody();
//            jsonObject = JSONObject.parseObject(resultInfo);

        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return resultInfo;
    }

    /**
     * 针对srm接收参数 有 "\" 解析参数失败问题
     * @param url
     * @param entity
     * @param map
     * @return
     */
    public String restTemplateByEntityWithParam1 (String url, String entity, Map<String, Object> map){
        String resultInfo = "";

        RestTemplate restTemplate = new RestTemplate();
        this.changeCharset(restTemplate);
        // 获取新ibus的头信息
        HttpHeaders headers = this.getNewIbusRestHeaders(map);

        ObjectMapper objectMapper = new ObjectMapper();
        HttpEntity<String> Object = null;
        Object = new HttpEntity<>(entity, headers);
        resultInfo = restTemplate.postForEntity(url, Object, String.class).getBody();

        return resultInfo;
    }

    public JSONObject restTemplateByString (String url, String value){
        String resultInfo = "";

        RestTemplate restTemplate = new RestTemplate();
        this.changeCharset(restTemplate);

        HttpHeaders headers = new HttpHeaders();
        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
        headers.setContentType(type);
        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
        ObjectMapper objectMapper = new ObjectMapper();
        HttpEntity<String> Object = null;
        JSONObject jsonObject = null;

        resultInfo = restTemplate.getForObject(url, String.class, value);
        jsonObject = JSONObject.parseObject(resultInfo);

        return jsonObject;
    }

    /**
     * 中文转码
     * @param restTemplate
     */
    public void changeCharset(RestTemplate restTemplate){
        List<HttpMessageConverter<?>> httpMessageConverters = restTemplate.getMessageConverters();
        httpMessageConverters.stream().forEach(httpMessageConverter -> {
            if(httpMessageConverter instanceof StringHttpMessageConverter){
                StringHttpMessageConverter messageConverter = (StringHttpMessageConverter) httpMessageConverter;
                //设置编码为UTF-8
                messageConverter.setDefaultCharset(Charset.forName("UTF-8"));
            }
        });
    }


    public HttpHeaders getNewIbusRestHeaders(Map<String, Object> map) {
        HttpHeaders headers = new HttpHeaders();
        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
        headers.setContentType(type);
        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
        String basicAuthUsername = map.get("basicAuthUsername") != null ? String.valueOf(map.get("basicAuthUsername")) : "";
        String basicAuthPassword = map.get("basicAuthPassword") != null ? String.valueOf(map.get("basicAuthPassword")) : "";
        String reqId = map.get("reqId") != null ? String.valueOf(map.get("reqId")) : "";
        String reqFrom = map.get("reqFrom") != null ? String.valueOf(map.get("reqFrom")) : "";
        if (StringUtils.isNotBlank(basicAuthUsername) && StringUtils.isNotBlank(basicAuthPassword)) {
            String userNameAndPassword = basicAuthUsername + ":" + basicAuthPassword;
            headers.set("authorization",
                    "Basic " +
                            Base64.getEncoder()
                                    .encodeToString(userNameAndPassword.getBytes()));
        }
        if (StringUtils.isNotBlank(reqId)) {
            headers.add("reqId", reqId);
        }
        if (StringUtils.isNotBlank(reqFrom)) {
            headers.add("reqFrom", reqFrom);
        }
        return headers;
    }
}

具体实现示例

SUPPLYPAYMENTPOLICYMANAGEMENT_UPDATE_URL为post接口,返回数据为列表时,提供服务的系统为DDD架构,返回数据为result封装后的list对象:

String url = VendorUrlConstant.SELECT_SUPPLY_BASE_INFO_LIKE;
JSONObject jsonObject = restTemplateClient.restTemplateByEntity(url, supplyBaseInfoDto);
if (jsonObject.get("code").toString().equals("0")) {
    String data = jsonObject.getString("data");
    List<SupplyBaseInfoDto> supplyBaseInfoDtos = (List<SupplyBaseInfoDto>) JSONArray.parseArray(data, SupplyBaseInfoDto.class);
   }
  //或者
  String url = VendorUrlConstant.SUPPLYPAYMENTPOLICYMANAGEMENT_UPDATE_URL;
  JSONObject jsonObject = restTemplateUtils.restTemplateByEntity(url, ouList);
  if(jsonObject.get("code").toString().equals("0")){
      String data = jsonObject.getString("data");
      Gson gson = new Gson();
      //将字符串转为对象list
      erp12List = gson.fromJson(data, new TypeToken<List<SupplyErp12InfoDto>>() {}.getType());
  }

TypeToken是一个匿名内部类,官方解释:Gson提供了TypeToken这个类来帮助我们捕获像list这样的泛型信息。java编译器就会把捕获到的泛型信息编译到这个匿名内部类中,然后再运行时就会被getType()方法用反射的API提取到。其实就是将T转成.class。

使用JSONArray类的JSONArray.parseArray(data, Demo.Class)方法,可以将字符串转成对象List;JSON.parseObject()将str转为对象。

get接口示例:

public List<FndVendorSitesDto> getBySupplyIdAndOuId(String supplyId, String ouId) {
        // 先根据ouId取出ouCode
        List<FndBusinessUnits> fndBusinessUnitsList = fndBusinessUnitsMapper.getOUByBusinessUnitId(ouId);
        String ouCode = "";
        if (fndBusinessUnitsList != null && fndBusinessUnitsList.size() > 0) {
            ouCode = fndBusinessUnitsList.get(0).getBusinessUnitCode();
        }
        List<FndVendorSitesDto> sitesDtoList = new ArrayList<>();
        // 去中台取ou和地点信息表
        OuAndAddressInformationDto ouAndAddressInformationDto = new OuAndAddressInformationDto();
        ouAndAddressInformationDto.setSupplyId(supplyId);
        ouAndAddressInformationDto.setOuCode(ouCode);
        String url = VendorUrlConstant.OUANDADDRESSINFO_SELECT;
        JSONObject jsonObject = restTemplateClient.restTemplateByEntity(url, ouAndAddressInformationDto);
        if (jsonObject.get("code").toString().equals("0")) {
            String data = jsonObject.getString("data");
            List<OuAndAddressInformationDto> dtoList = JSONArray.parseArray(data, OuAndAddressInformationDto.class);
            // 创建FndVendorSitesDto
            for(OuAndAddressInformationDto dto : dtoList){
                FndVendorSitesDto fndVendorSitesDto = new FndVendorSitesDto();
                //xxx
                sitesDtoList.add(fndVendorSitesDto);
            }
        }
        return sitesDtoList;
    }

直接调用其他系统的api接口实例

A系统被调用接口,代码如下:

@RequestMapping("/srmSyncData")
    public RestResponse srmSyncData(@RequestBody List<RequestPricePlatformDto> list){
        ObjectMapper objectMapper = new ObjectMapper();
        List<RequestPricePlatformDto> list1 = new ArrayList<>(list);
        List<RequestPricePlatformDto> returnList = new ArrayList<>(list);
        String failReason = "";
        ......

	} catch (Exception e) {
            e.printStackTrace();
            return RestResponse.error().put("data", returnList);
        }
    return RestResponse.success().put("data", returnList);

B系统 调用方接口逻辑

//创建请求头
                HttpHeaders headers = new HttpHeaders();
                MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
                headers.setContentType(type);
                headers.add("Accept", MediaType.APPLICATION_JSON.toString());
                String url = "http://" + IosServiceProperties.getPriceHost() + ":8888/platform-plus/ladderPrice/pricePlatform/srmSyncData";
                JSONObject jsonObject = restTemplateClient.restTemplateByEntity(url, list);

                if(jsonObject.get("code").toString().equals("0")){
                    String data = jsonObject.getString("data");
                    Gson gson = new Gson();
                    priceResDtoList = gson.fromJson(data, new TypeToken<List<RequestPricePlatformItfDto>>() {}.getType());
                }
                ......

未完待续…

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个简单的Java实现,用于将PLM系统中的物料数据传输到ERP系统中。 首先,需要创建一个Java类来实现webservice接口。您可以使用JAX-WS来创建webservice,它是Java API for XML Web Services的缩写。以下是一个示例代码: ```java import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; @WebService public class PLMtoERPWebService { @WebMethod public String transferMaterialData(@WebParam(name = "materialData") String materialData) { // 在这里编写将materialData传输到ERP系统的代码 return "Material data transfer successful!"; } } ``` 在这个示例代码中,我们使用@WebService注释来标识这是一个webservice接口。@WebMethod注释用于标识我们要暴露给外部调用的方法。在这里,我们只需要一个方法来传输物料数据。 在该方法中,我们使用@WebParam注释来指定方法的参数名为“materialData”。在方法体中,我们可以编写将物料数据传输到ERP系统的代码。在这里,我们假设您已经知道如何将数据传输到ERP系统,因此这里的代码略过。 最后,我们只需要将该类发布为webservice即可。您可以使用Java SE中自带的工具wsimport来生成客户端代码。以下是一个示例代码: ```java import javax.xml.namespace.QName; import javax.xml.ws.Service; import java.net.URL; public class PLMtoERPWebServiceClient { public static void main(String[] args) throws Exception { URL url = new URL("http://localhost:8080/plm-to-erp-webservice?wsdl"); QName qname = new QName("http://webservice.example.com/", "PLMtoERPWebServiceService"); Service service = Service.create(url, qname); PLMtoERPWebService plmToErpWebService = service.getPort(PLMtoERPWebService.class); String materialData = "Material data"; String response = plmToErpWebService.transferMaterialData(materialData); System.out.println(response); } } ``` 在这个示例代码中,我们使用了Java SE中的Service类来创建一个webservice客户端。我们首先指定了webservice的WSDL地址和服务名称,然后通过getServicePort方法获取接口的代理类。最后,我们可以调用代理类中的方法来远程调用webservice接口。 以上就是一个简单的Java实现,用于将PLM系统中的物料数据传输到ERP系统中。您可以根据实际需求进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值