在SAP云平台上使用SAP Cloud SDK调用MultiChain服务

本文描述了在JAVA Springboot项目中使用SAP Cloud SDK调用Multichain服务,与S/4HANA Cloud集成,并将项目部署到SAP云平台的过程。

实现业务场景:

  • 将某业务伙伴(Business Partner)的IBAN从S/4HANA Cloud读出后写入区块链以及从链中读出。

IBAN是国际银行帐户号码(The International Bank Account Number)的代码。
国际银行帐户号码,通常简称IBAN,是由欧洲银行标准委员会,按照其标准制定的一个银行帐户号码。

步骤

  1. 使用mvn archetype:generate生成JAVA Springboot项目骨架
mvn archetype:generate -DarchetypeGroupId=com.sap.cloud.sdk.archetypes -DarchetypeArtifactId=scp-cf-spring -DarchetypeVersion=3.1.0
groupId: com.mycompany.test
artifactId: TechEd_AIN101
version: 1.0-SNAPSHOT
package: com.mycompany.test
在SAP云平台上使用SAP Cloud SDK调用MultiChain服务_第1张图片
image.png
  1. 引入(import)项目到IDE中,将SAP Cloud MultiChain SDK依赖加入pom.xml
       
        
            com.sap.cloud.sdk.services
            blockchain
        
在SAP云平台上使用SAP Cloud SDK调用MultiChain服务_第2张图片
image.png
  1. 进入项目目录,安装依赖
mvn clean install -Dmaven.test.skip=true
  1. 将IBAN写入区块链或者从区块链读出时,我们需要返回IBAN码,Publisher和上链时间。
    根据需求对返回对象进行建模如下:
package com.mycompany.test.models;
import com.fasterxml.jackson.annotation.JsonProperty;

public class IBANResponse {
    @JsonProperty("iban")
    private final String iban;
    @JsonProperty("publisher")
    private final String publisher;
    @JsonProperty("blockime")
    private final String blocktime;

    public IBANResponse( final String iban, final String publisher, final String blocktime ) {
        this.iban = iban;
        this.publisher = publisher;
        this.blocktime = blocktime;
    }
}
  1. 分别创建读写控制器,将IBAN码上链或从链中读出
  • 上链
    将公司company_01的IBAN码ES7921000813610123456789写入区块链中
package com.mycompany.test.controllers;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.sap.cloud.sdk.services.blockchain.multichain.service.MultichainService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.mycompany.test.models.IBANResponse;


@RestController
@RequestMapping( "/write" )
public class WriteIBANController {

    private static final Logger logger = LoggerFactory.getLogger(WriteIBANController.class);
    private static final String COMPANY_ID = "company_01";

    @RequestMapping( method = RequestMethod.GET )
    public ResponseEntity writeIBAN( @RequestParam( defaultValue = "ES7921000813610123456789" ) final String iban )
    {
        MultichainService mcService = MultichainService.create();
        String streamID = "root";
        List keys = Arrays.asList(COMPANY_ID);
        Map value = new HashMap() {{ put("IBAN", iban); }}; mcService.publishJson(streamID, keys, value, null);
        logger.info("IBAN " + iban + " provided");
        return ResponseEntity.ok(new IBANResponse(iban, "", ""));
    }
}
  • 从链中读出
    将公司company_01的IBAN码从区块链中读出
package com.mycompany.test.controllers;
import java.util.HashMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.mycompany.test.models.IBANResponse;
import com.sap.cloud.sdk.services.blockchain.multichain.model.MultichainResult;
import com.sap.cloud.sdk.services.blockchain.multichain.service.MultichainService;

@RestController
@RequestMapping( "/read" )
public class ReadIBANController {

    private static final Logger logger = LoggerFactory.getLogger(ReadIBANController.class);

    @RequestMapping( method = RequestMethod.GET )
    public ResponseEntity getIBAN( @RequestParam( defaultValue = "company_01" ) final String companyID )
    {

        // Create MultiChain instance
        MultichainService mcService = MultichainService.create();

        // Execute query
        MultichainResult queryResult = mcService.getLatestEntryOnStream("root", companyID).get();

        // get IBAN value out of Result
        String iban = ((HashMap) queryResult.getJsonData().get("json")).get("IBAN");
        String publisher = queryResult.getPublishers().get(0);
        String blocktime = queryResult.getBlocktime().toString();

        logger.info("IBAN " + iban + " provided. Published by " + publisher + " at " + blocktime);
        return ResponseEntity.ok(new IBANResponse(iban, publisher, blocktime));

    }
}
  1. 执行mvn clean package -Dmaven.test.skip=true编译项目
  2. 登陆cfcf login成功后执行cf push将项目推送部署到SAP云平台
    在SAP云平台上使用SAP Cloud SDK调用MultiChain服务_第3张图片
    image.png

在SAP云平台上使用SAP Cloud SDK调用MultiChain服务_第4张图片
image.png

部署完成后进入应用程序, 查看应用程序路由,我这里是 https://techedain101-reliable-wolverine.cfapps.us10.hana.ondemand.com/
在SAP云平台上使用SAP Cloud SDK调用MultiChain服务_第5张图片
image.png

点击路由进入如下页面,说明已经成功将安装Sap Clou SDK的Java Springboot项目部署到了SAP云平台上

在SAP云平台上使用SAP Cloud SDK调用MultiChain服务_第6张图片
image.png
  1. 截止到上一步,我们应用程序的部署和SAP Cloud SDK的安装已经成功。接下来,为了调用MultiChain服务,还需要在SAP云平台上创建MultiChain服务实例(或使用已存在实例),将MultiChain服务实例与应用进行绑定。
  • 进入MultiChain服务


    在SAP云平台上使用SAP Cloud SDK调用MultiChain服务_第7张图片
    image.png
  • 创建MultiChain实例


    在SAP云平台上使用SAP Cloud SDK调用MultiChain服务_第8张图片
    image.png

    注意在分配应用程序时绑定我们刚刚部署的项目


    在SAP云平台上使用SAP Cloud SDK调用MultiChain服务_第9张图片
    image.png
  1. 重启应用程序,使绑定生效
在SAP云平台上使用SAP Cloud SDK调用MultiChain服务_第10张图片
image.png
  1. 访问https://techedain101-reliable-wolverine.cfapps.us10.hana.ondemand.com/write可以看到我们成功将company_01公司的默认IBAN码写入区块链

    在SAP云平台上使用SAP Cloud SDK调用MultiChain服务_第11张图片
    image.png

  2. 访问https://techedain101-reliable-wolverine.cfapps.us10.hana.ondemand.com/read
    查询写入的IBAN,可以看到返回结果除了包含上一步写入的IBAN码,还有上链时区块链生成的publisher和blocktime。

    在SAP云平台上使用SAP Cloud SDK调用MultiChain服务_第12张图片
    image.png

  3. 打开MultiChain服务实例仪表盘


    在SAP云平台上使用SAP Cloud SDK调用MultiChain服务_第13张图片
    image.png
在SAP云平台上使用SAP Cloud SDK调用MultiChain服务_第14张图片
image.png

可以看到我们刚刚记录的数据都已经在链上


在SAP云平台上使用SAP Cloud SDK调用MultiChain服务_第15张图片
image.png

至此,已经成功的在SAP云平台上使用SAP Cloud SDK调用MultiChain服务。
除了如上通过传参数的方式传递IBAN码,我们还可以通过与S/4HANA Cloud集成,将从S/4HANA Cloud查询出的IBAN码记录到区块链上。

集成S/4HANA Cloud

  1. 访问https://api.sap.com/api/API_BUSINESS_PARTNER/resource,登陆获取APIKey

https://api.sap.com/api/API_BUSINESS_PARTNER/resource是SAP提供的可对SAP S/4HANA系统中业务伙伴(Business Partner),供应商(Supplier)和客户(Customer)主数据进行增删改查操作的沙箱环境。

在SAP云平台上使用SAP Cloud SDK调用MultiChain服务_第16张图片
image.png

可以使用API GET /A_BusinessPartner('{BusinessPartner}')/to_BusinessPartnerBank对业务伙伴的银行信息进行查询,
例如,查询BusinessPartner Number为10100001业务伙伴的银行信息


在SAP云平台上使用SAP Cloud SDK调用MultiChain服务_第17张图片
image.png
  1. 修改WriteIBANController,加入与S/4HANA Cloud集成逻辑
    @RequestMapping( method = RequestMethod.GET )
    public ResponseEntity writeIBAN( @RequestParam( defaultValue = "ES7921000813610123456789" ) final String iban )
    {
        String hana_iban = iban;
        // 当参数为write?iban=erp时,从S/4HANA Cloud获取IBAN码
        if (iban.equals("erp")) {
        // 填写上一步获取的APIKey
            Header header = new Header("APIKey", "PT4h670e89u3ozdAp5hkA4ejNr4eCGJ3");
        // 向沙箱S/4HANA Cloud系统发送请求
            DefaultHttpDestination destination = DefaultHttpDestination.builder("https://sandbox.api.sap.com/s4hanacloud").header(header).build();

            try {
                BusinessPartnerBank bankDetails = new DefaultBusinessPartnerService().getBusinessPartnerBankByKey("10100001", "0001").execute(destination);
        // 取出从S/4HANA Cloud系统返回的IBAN码
                hana_iban = bankDetails.getIBAN();
            } catch (ODataException e) {
                return ResponseEntity.ok(new IBANResponse("NOT FOUND","",""));
            }
        }

        MultichainService mcService = MultichainService.create();
        String streamID = "root";
        List keys = Arrays.asList(COMPANY_ID);
        final String myIBAN = hana_iban;
        Map value = new HashMap() {{ put("IBAN", myIBAN); }}; mcService.publishJson(streamID, keys, value, null);
        logger.info("IBAN " + myIBAN + " provided");
        return ResponseEntity.ok(new IBANResponse(myIBAN, "", ""));
    }

后重新cf push部署应用程序

  1. 访问https://techedain101-reliable-wolverine.cfapps.us10.hana.ondemand.com/write?iban=erp
    可以看到从S/4HANA Cloud查询得出的BusinessPartner Number为10100001业务伙伴的IBAN码DE21230300000001230003被记录到区块链上。
    在SAP云平台上使用SAP Cloud SDK调用MultiChain服务_第18张图片
    image.png

你可能感兴趣的:(在SAP云平台上使用SAP Cloud SDK调用MultiChain服务)