CPI中通过$batch处理http请求

该博客介绍了如何使用Groovy语言构建一个批处理请求,针对/$batch endpoint,包含多个PATCH和POST请求。示例中展示了如何创建一个包含IFInstance和IFItem更新的请求报文,并设置了相应的HTTP头信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1:指定请求endpoint为/$batch

2:构建请求内容:

import com.sap.gateway.ip.core.customdev.util.Message;
import java.util.HashMap;
import groovy.json.*
import java.util.UUID;

import static groovy.json.JsonOutput.*

// @Grab('com.google.code.gson:gson:2.8+')
import com.google.gson.Gson
import com.google.gson.annotations.SerializedName

class BatchRequest {
    def requests
}

class Request{
    String id 
    String method
    String url
    def headers
    def body 
}

class IFInstanceStruc {
    String EndDateTime
    int TotalNum
    int SuccessNum
    int ErrorNum
    int Status
}

class HttpHeader {
    @SerializedName("content-type")
    String contenttype 
}

def HttpHeader getCommonHttpHeader(){
    return new HttpHeader(
        contenttype : "application/json"
    );
}

def Message processData(Message message) {
    //Body
    def requests = [];
    
    def body = message.getBody(String);
    def logBody = new JsonSlurper().parseText(body);
    
    BatchRequest batchRequest = new BatchRequest(
        requests:[]
    );
    
    
    // IFInstance PATCH
    IFInstanceStruc ifInstanceBody = new IFInstanceStruc(
        EndDateTime : logBody.EndDateTime,
        TotalNum : logBody.TotalNum,
        SuccessNum : logBody.SuccessNum,
        ErrorNum : logBody.ErrorNum,
        Status : logBody.Status
    );
    // def ifInstanceBodyJSON = new Gson().toJson(ifInstanceBody)
    
    Request ifInstanceRequest = new Request(
        id : UUID.randomUUID().toString(),
        method: "PATCH",
        url : "/IFInstance(" + logBody.ID + ")",
        headers : getCommonHttpHeader(),
        body : ifInstanceBody
    )
    requests.add(ifInstanceRequest);
    
    
    // IFItem PATCH
    logBody.toItems.each {
        Request ifItemRequest = new Request(
            id: UUID.randomUUID().toString(),
            method: "POST",
            url: "/IFInstance(" + logBody.ID + ")/toItems",
            headers: getCommonHttpHeader(),
            body: it
        )
        requests.add(ifItemRequest)
    }
    
    // Add to Batch Request
    batchRequest.requests = requests;
    
    def gson = new Gson().toJson(batchRequest)
    message.setBody(gson);
    
    //设置 http header
    message.setHeader("Content-Type", "application/json")
    message.setHeader("Accept", "*/*")
    return message;
}

 生成请求报文格式如下:

{
    "requests": [
        {
            "id": "c9863906-5889-433d-96df-93551b56bcb3",
            "method": "PATCH",
            "url": "/IFInstance(4c38271a-17ba-462e-803e-0475b37a5145)",
            "headers": {
                "content-type": "application/json"
            },
            "body": {
                "EndDateTime": "2021-12-01T06:01:25.621Z",
                "TotalNum": 0,
                "SuccessNum": 0,
                "ErrorNum": 0,
                "Status": 1
            }
        },
        {
            "id": "101c7ebf-a5b2-47ca-8fdb-62fb2db0e98f",
            "method": "POST",
            "url": "/IFInstance(4c38271a-17ba-462e-803e-0475b37a5145)/toItems",
            "headers": {
                "content-type": "application/json"
            },
            "body": {
                "Result": "S",
                "Message": "成功処理 購買情報マスタ登録されました",
                "Source": "S4",
                "Target": "MMSS",
                "TransMethod": "Webservice",
                "toMessages": [
                    {
                        "HGUID": "4c38271a-17ba-462e-803e-0475b37a5145",
                        "MsgClass": "MMSS_A006",
                        "MsgType": "S",
                        "MsgNo": "11",
                        "Message": "成功処理 購買情報マスタ登録されました"
                    }
                ]
            }
        }
    ]
}

批处理请求的使用方式可以参考以下链接:

Combine multiple requests in one HTTP call using JSON batching - Microsoft Graph | Microsoft Docsicon-default.png?t=LA92https://docs.microsoft.com/en-us/graph/json-batching

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeveloperMrMeng

觉得有用的佛系投币哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值