【ABAP】JSON形式のデータを外部に送信(POST)する

#やること
SAP標準のフライト情報を、JSON形式で外部に送信する。
宛先の設定はT-CD:SM59で行う。

参考：[How to Prepare JSON in ABAP & Send Response to Cloud?](https://www.zapyard.com/how-to-prepare-json-in-abap-send-response-to-cloud/)
#手順
##SM59で宛先設定
検証のみのため、[httpbin](https://httpbin.org/)を使用します。
※httpbinの使用方法などについては、Postmanなどで事前に検証してください

参考：[APIクライアント開発時のモックに使えるhttpbinの紹介](https://qiita.com/sameyasu/items/adacceb8a1bee893599b)

###接続テスト
RFC宛先：Z_HTTPBIN(任意)
接続タイプ：G
対象ホスト：httpbin.org
パス接頭辞：ブランク(接続確認のため)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22526/8711dea2-d6aa-8e32-9395-92f855f2fade.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22526/876901d0-9ae5-fdc9-16d2-f39461b4db47.png)

接続テスト結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22526/edf33d6b-86e3-3561-58ce-dc8567d1debc.png)

###接続テスト後
パス接頭辞に **/post** を追加する(httpbinでのPOST用のパス)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22526/4f239b7e-ade8-846b-247a-f19eb860ecbe.png)

##コーディング
クラス **IF_HTTP_CLIENT** を使用

```ABAP:Y_POST_JSON
  CONSTANTS lc_content    TYPE string VALUE 'Content-Type'.
  CONSTANTS lc_contentval TYPE string VALUE 'application/json'.

  DATA lo_http_client TYPE REF TO if_http_client.
  DATA lv_httpcode    TYPE i.
  DATA lv_reason      TYPE string.

* データ抽出
  SELECT *
    FROM sflight
    INTO TABLE @DATA(lt_flightdata).

* 内部テーブルからJSONに変換
  DATA(lv_json) = /ui2/cl_json=>serialize( lt_flightdata ).

* 変換結果の確認
  cl_demo_output=>display_json( lv_json ).

* 宛先の設定
  CALL METHOD cl_http_client=>create_by_destination
    EXPORTING
      destination              = 'Z_HTTPBIN'  "SM59で作成した宛先
    IMPORTING
      client                   = lo_http_client
    EXCEPTIONS
      argument_not_found       = 1
      destination_not_found    = 2
      destination_no_authority = 3
      plugin_not_active        = 4
      internal_error           = 5
      OTHERS                   = 6.
  IF sy-subrc <> 0.
* 省略
  ENDIF.

  lo_http_client->refresh_request( ).
  lo_http_client->request->set_version( if_http_request=>co_protocol_version_1_0 ).

* メソッドの設定(POST)
  CALL METHOD lo_http_client->request->set_method
    EXPORTING
      method = lo_http_client->request->co_request_method_post.

* ヘッダ部の設定
  CALL METHOD lo_http_client->request->set_header_field
    EXPORTING
      name  = lc_content
      value = lc_contentval.

* JSONデータの設定
  CALL METHOD lo_http_client->request->set_cdata
    EXPORTING
      data = lv_json.

* データ送信
  lo_http_client->send(
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2 ).

* 送信結果の取得
  lo_http_client->receive(
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3 ).

* ステータス取得
  CALL METHOD lo_http_client->response->get_status
    IMPORTING
      code   = lv_httpcode
      reason = lv_reason.

* 結果出力
  WRITE lv_httpcode.
  WRITE lv_reason.
```

##実行
###変換結果の確認
cl_demo_outputでJSON変換結果を確認
参考：[【ABAP】内部テーブルをJSONに変換する](https://qiita.com/mahko2/items/c0de1c1f41103593b47e)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22526/57d7ded3-1f81-1366-d924-9368a20c8a14.png)

###実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22526/4480f3de-bfa8-1031-eaf1-d5f3e9fd4505.png)


#参考
- [How to Prepare JSON in ABAP & Send Response to Cloud?](https://www.zapyard.com/how-to-prepare-json-in-abap-send-response-to-cloud/)
- [【ABAP】内部テーブルをJSONに変換する](https://qiita.com/mahko2/items/c0de1c1f41103593b47e)
- [APIクライアント開発時のモックに使えるhttpbinの紹介](https://qiita.com/sameyasu/items/adacceb8a1bee893599b)
- [Example Program: Executing an HTTP Request](https://help.sap.com/saphelp_snc700_ehp01/helpdata/en/1f/93163f9959a808e10000000a114084/content.htm?no_cache=true)