今回の学習内容

今日は、SAP の公式 API カタログ(api.sap.com)を使ったサンドボックス API の確認から、CAP Java アプリでの実際のデータ取得、そして BTP Cockpit での Destination 設定までを学習しました。

① api.sap.com とは

SAP が公式に提供する API カタログです。S/4HANA をはじめ、SAP 製品の標準 API がすべて公開されています。

機能 内容
API Referenceエンドポイント・パラメータ・レスポンスの確認
Schema Viewデータ構造の確認
Try Outサンドボックス環境で API を実際に叩ける
API Keyサンドボックス用の認証キー(無料で取得可能)

② Sales Order A2X API の確認

S/4HANA の受注データを操作する標準 API です。ABAP の VBAK/VBAP テーブルに対応しています。

GET  /SalesOrder                        ← 受注一覧取得(VBAK)
POST /SalesOrder                        ← 受注作成
GET  /SalesOrder/{SalesOrder}           ← 1件取得
PATCH /SalesOrder/{SalesOrder}          ← 受注更新
GET  /SalesOrder/{SalesOrder}/_Item     ← 明細取得(VBAP)
POST /SalesOrder/{SalesOrder}/_Item     ← 明細追加
API フィールド ABAP テーブル 意味
SalesOrderVBAK-VBELN受注番号
SalesOrderTypeVBAK-AUART受注種別
SoldToPartyVBAK-KUNNR受注先
TotalNetAmountVBAK-NETWR正味金額

③ CAP Java から SAP サンドボックス API を呼び出す

Spring Boot の RestTemplate を使って api.sap.com のサンドボックス API を呼び出します。

SalesOrderService.java

@Service
public class SalesOrderService {

    private static final String SANDBOX_URL =
        "https://sandbox.api.sap.com/s4hanacloud/sap/opu/odata4/sap/" +
        "api_salesorder/srvd_a2x/sap/salesorder/0001/SalesOrder";

    private static final String API_KEY = "your-api-key";

    public String getSalesOrders() {
        RestTemplate restTemplate = new RestTemplate();

        HttpHeaders headers = new HttpHeaders();
        headers.set("APIKey", API_KEY);
        headers.set("Accept", "application/json");

        HttpEntity<String> entity = new HttpEntity<>(headers);

        ResponseEntity<String> response = restTemplate.exchange(
            SANDBOX_URL + "?$top=3&$select=SalesOrder,SalesOrderType,SoldToParty",
            HttpMethod.GET,
            entity,
            String.class
        );

        return response.getBody();
    }
}

SalesOrderController.java

@RestController
@RequestMapping("/api")
public class SalesOrderController {

    @Autowired
    private SalesOrderService salesOrderService;

    @GetMapping(value = "/salesorders", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<String> getSalesOrders() {
        String result = salesOrderService.getSalesOrders();
        return ResponseEntity.ok()
            .contentType(MediaType.APPLICATION_JSON)
            .body(result);
    }
}

Bruno で確認:

GET http://localhost:8080/api/salesorders
→ S/4HANA サンドボックスの受注データが JSON で返ってくる!

④ トラブルシューティング

エラー 原因 解決方法
Property 'NetAmount' not found A2X API ではフィールド名が異なる NetAmountTotalNetAmount
Invalid name start character '@' OData の @odata.context を Map で受け取れない Map の代わりに String で受け取る

⑤ Destination Service とは

BTP 上で接続先の URL・認証情報を一元管理する仕組みです。コードに URL やパスワードを直書きしなくて済みます。

❌ 良くない書き方(ローカル開発のみ)
private static final String API_KEY = "ハードコード";
private static final String URL = "https://...ハードコード";

✅ 正しい書き方(本番環境)
// コードには Destination 名だけ書く
// URL・認証情報は BTP Cockpit で管理
環境 接続方法 用途
ローカル開発RestTemplate + ハードコード開発・テスト
BTP 本番環境Destination Service 経由本番デプロイ
オンプレミス S/4HANACloud Connector + Destination社内システム連携

⑥ BTP Cockpit で Destination を作成

BTP Cockpit → サブアカウント → コネクティビティ → 宛先 → 作成 の手順で作成しました。

項目
名前S4HANA_SANDBOX
タイプHTTP
URLhttps://sandbox.api.sap.com/s4hanacloud
プロキシタイプInternet
認証NoAuthentication

⑦ 会社環境での API 作成方法

標準 API がない場合、ABAP RAP(RESTful Application Programming)で カスタム OData V4 API を作ります。SE38 ではなく Eclipse + ADT を使います。

① まず api.sap.com で標準 API を探す(8割はここで解決)
    ↓ なければ
② BASIS に Communication Arrangement の設定を依頼
    ↓ カスタム要件があれば
③ ABAP 開発者が ADT で CDS + RAP を作成
    ↓
④ BTP の Destination に URL・認証情報を登録
    ↓
⑤ CAP Java から Destination 経由で呼び出す

この記事は「SAP BTP 学習」シリーズの第6回です。6ヶ月間の独学で SAP BTP 開発へのキャリアチェンジを目指しています。