SAP ABAP调用DeepSeek API 接口示例程序代码

本文提供一个可以实际测试调用DeepSeek接口示例程序。注意:需要替换API密钥和SAP服务器开通相关网权限和STRUST导入HTTPS证书。

DeepSeek API 文档
https://api-docs.deepseek.com/zh-cn

首次调用 API
DeepSeek API 使用与 OpenAI 兼容的 API 格式,通过修改配置,您可以使用 OpenAI SDK 来访问 DeepSeek API,或使用与 OpenAI API 兼容的软件。

DeepSeek API 文档

SAP ABAP调用DeepSeek接口示例程序

请求报文

{
  "model": "deepseek-chat",
  "messages": [
    {
      "role": "user",
      "content": "ABAP写Hellor world!"
    }
  ],
  "temperature": 1.0
}

SAP ABAP调用DeepSeek接口示例程序 响应报文

{
  "id": "6f47cae2-831b-4d84-96cf-e0b1c595690c",
  "object": "chat.completion",
  "created": 1739241345,
  "model": "deepseek-chat",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "在ABAP中,你可以使用 `WRITE` 语句来输出 \"Hello, World!\"。以下是一个简单的ABAP程序示例:\n\n```abap\nREPORT z_hello_world.\n\nSTART-OF-SELECTION.\n  WRITE: / 'Hello, World!'.\n```\n\n### 解释:\n- `REPORT z_hello_world.`:定义了一个名为 `z_hello_world` 的报告程序。\n- `START-OF-SELECTION.`:这是ABAP程序的入口点,程序从这里开始执行。\n- `WRITE: / 'Hello, World!'.`:`WRITE` 语句用于输出文本。`/` 表示换行,`'Hello, World!'` 是要输出的文本。\n\n### 运行程序:\n1. 在SAP系统中创建一个新的ABAP程序(例如 `Z_HELLO_WORLD`)。\n2. 将上述代码复制到程序中。\n3. 保存并激活程序。\n4. 运行程序,你将在输出窗口中看到 \"Hello, World!\"。\n\n这就是在ABAP中编写和运行 \"Hello, World!\" 程序的基本步骤。"
      },
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 10,
    "completion_tokens": 239,
    "total_tokens": 249,
    "prompt_tokens_details": { "cached_tokens": 0 },
    "prompt_cache_hit_tokens": 0,
    "prompt_cache_miss_tokens": 10
  },
  "system_fingerprint": "fp_3a5770e1b4"
}

SAP ABAP调用DeepSeek接口示例程序

SAP ABAP调用DeepSeek接口示例程序

*&---------------------------------------------------------------------*
*& Report Z_DEEPSEEK_API_CALL
*&---------------------------------------------------------------------*
*& SAP ABAP调用DeepSeek接口示例程序
*& DeepSeek-V3 的综合能力 DeepSeek-V3 在推理速度上相较历史模型有了大幅提升。
*&---------------------------------------------------------------------*
REPORT Z_DEEPSEEK_API_CALL NO STANDARD PAGE HEADING.

DATA: LT_HEADERS TYPE TIHTTPNVP,
      LT_COOKIES TYPE TIHTTPCKI.

DATA: LW_HEADERS TYPE IHTTPNVP,
      LW_COOKIES TYPE IHTTPCKI.

DATA: LO_HTTP_CLIENT TYPE REF TO IF_HTTP_CLIENT,
      LV_METHOD      TYPE STRING,
      LV_URL         TYPE STRING VALUE 'https://api.deepseek.com/v1/chat/completions', " API地址
      LV_API_KEY     TYPE STRING VALUE 'sk-9824d878b', " 替换为你的API密钥
      LV_REQUEST     TYPE STRING,
      LV_RESPONSE    TYPE STRING.

TYPES: BEGIN OF T_MESSAGE3,
         ROLE    TYPE STRING,
         CONTENT TYPE STRING,
       END OF T_MESSAGE3.
TYPES: BEGIN OF T_PROMPT_TOKENS_DETAILS4,
         CACHED_TOKENS TYPE I,
       END OF T_PROMPT_TOKENS_DETAILS4.
TYPES: BEGIN OF T_CHOICES2,
         INDEX         TYPE I,
         MESSAGE       TYPE T_MESSAGE3,
         FINISH_REASON TYPE STRING,
       END OF T_CHOICES2.
TYPES: BEGIN OF T_USAGE5,
         PROMPT_TOKENS            TYPE I,
         COMPLETION_TOKENS        TYPE I,
         TOTAL_TOKENS             TYPE I,
         PROMPT_TOKENS_DETAILS    TYPE T_PROMPT_TOKENS_DETAILS4,
         PROMPT_CACHE_HIT_TOKENS  TYPE I,
         PROMPT_CACHE_MISS_TOKENS TYPE I,
       END OF T_USAGE5.
TYPES: TT_CHOICES2 TYPE STANDARD TABLE OF T_CHOICES2 WITH DEFAULT KEY.
TYPES: BEGIN OF T_JSON1,
         ID                 TYPE STRING,
         OBJECT             TYPE STRING,
         CREATED            TYPE P LENGTH 16 DECIMALS 0,
         MODEL              TYPE STRING,
         CHOICES            TYPE TT_CHOICES2,
         USAGE              TYPE T_USAGE5,
         SYSTEM_FINGERPRINT TYPE STRING,
       END OF T_JSON1.

DATA: LW_DATA TYPE T_JSON1.

DATA: LW_CHOICES TYPE T_CHOICES2.

SELECTION-SCREEN BEGIN OF BLOCK B101 WITH FRAME TITLE TEXT-101.
  PARAMETERS: P_METHOD TYPE UJX0_AT_TESTLOG-METHOD OBLIGATORY DEFAULT 'POST',
              P_URL    TYPE STRING LOWER CASE DEFAULT 'https://api.deepseek.com/v1/chat/completions',
              P_APIKEY TYPE STRING LOWER CASE DEFAULT 'sk-xxxxxx',
              P_REQ    TYPE STRING LOWER CASE DEFAULT '{"model":"deepseek-chat","messages":[{"role":"user","content":"Hello!"}],"temperature":1.0}'.
SELECTION-SCREEN END OF BLOCK B101.

INITIALIZATION.

START-OF-SELECTION.

  LV_METHOD  = P_METHOD.
  LV_URL     = P_URL.
  LV_API_KEY = P_APIKEY.
  LV_REQUEST = P_REQ.

* 创建HTTP客户端
  CL_HTTP_CLIENT=>CREATE_BY_URL(
    EXPORTING
      URL    = LV_URL
    IMPORTING
      CLIENT = LO_HTTP_CLIENT
  ).

* 设置HTTP方法
  LO_HTTP_CLIENT->REQUEST->SET_METHOD( LV_METHOD ).

* 设置请求头
  LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD(
    NAME  = 'Content-Type'
    VALUE = 'application/json' ).

  LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD(
    NAME  = 'Authorization'
    VALUE = |Bearer { LV_API_KEY }| ).

* 构建JSON请求体
*  lv_request = '{"model":"deepseek-chat","messages":[{"role":"user","content":"Hello!"}],"temperature":1.0}'. " 根据API文档调整参数
*lv_request = '{"model":"deepseek-chat","messages":[{"role":"user","content":"Hello!"}],"temperature":0.7}'. " 根据API文档调整参数

* 设置请求数据
  LO_HTTP_CLIENT->REQUEST->SET_CDATA( LV_REQUEST ).

  ULINE.
  WRITE:/ P_URL.

* 发送请求
  TRY.
      LO_HTTP_CLIENT->SEND( ).
      LO_HTTP_CLIENT->RECEIVE( ).

      " 获取响应
      LV_RESPONSE = LO_HTTP_CLIENT->RESPONSE->GET_CDATA( ).

      " 处理响应(示例:直接输出)
      WRITE :/ 'API Response:', LV_RESPONSE.

    CATCH CX_ROOT INTO DATA(LX_ERROR).
      WRITE: / 'Error:', LX_ERROR->GET_TEXT( ).
  ENDTRY.

  PERFORM FRM_RESPONSE_GET_HEADERS USING LO_HTTP_CLIENT CHANGING LT_HEADERS.

  PERFORM FRM_RESPONSE_GET_COOKIE  USING LO_HTTP_CLIENT CHANGING LT_COOKIES.

* 关闭连接
  LO_HTTP_CLIENT->CLOSE( ).

  ULINE.
  WRITE:/ P_REQ.

  ULINE.
  WRITE:/ LV_RESPONSE.

  LOOP AT LT_HEADERS INTO LW_HEADERS.
    WRITE:/ LW_HEADERS-NAME, LW_HEADERS-VALUE.
  ENDLOOP.

  WRITE:/ 'get_cookies'.
  ULINE.

  LOOP AT LT_COOKIES INTO LW_COOKIES.
    WRITE:/ LW_COOKIES-NAME, / LW_COOKIES-VALUE, / LW_COOKIES-EXPIRES.
  ENDLOOP.


  PERFORM FRM_JSON_ABAP USING LV_RESPONSE 'X' CHANGING LW_DATA.
  LOOP AT LW_DATA-CHOICES INTO LW_CHOICES.
    PERFORM FRM_SHOW_HTML USING LW_CHOICES-MESSAGE-CONTENT.
  ENDLOOP.


  PERFORM FRM_DISPLAY_JSON_HTML USING LV_RESPONSE.

FORM FRM_RESPONSE_GET_HEADERS USING    LO_CLIENT TYPE REF TO IF_HTTP_CLIENT
                              CHANGING LT_FIELDS TYPE TIHTTPNVP.
  REFRESH: LT_FIELDS.
  CALL METHOD LO_CLIENT->RESPONSE->GET_HEADER_FIELDS
    CHANGING
      FIELDS = LT_FIELDS.
ENDFORM.

FORM FRM_RESPONSE_GET_COOKIE USING    LO_CLIENT    TYPE REF TO IF_HTTP_CLIENT
                             CHANGING LT_TIHTTPCKI TYPE TIHTTPCKI.
  REFRESH: LT_TIHTTPCKI.
  CALL METHOD LO_CLIENT->RESPONSE->GET_COOKIES
    CHANGING
      COOKIES = LT_TIHTTPCKI.
ENDFORM.


FORM FRM_SHOW_HTML USING LV_HTML.
  CALL METHOD CL_ABAP_BROWSER=>SHOW_HTML
    EXPORTING
      HTML_STRING = LV_HTML.
ENDFORM.

FORM FRM_SHOW_XML USING LV_XML.
  CALL METHOD CL_ABAP_BROWSER=>SHOW_XML
    EXPORTING
      XML_STRING = LV_XML.
ENDFORM.

FORM FRM_DISPLAY_XML USING LV_XML.
  CALL METHOD CL_DEMO_OUTPUT=>DISPLAY_XML
    EXPORTING
      XML = LV_XML.
ENDFORM.

FORM FRM_DISPLAY_JSON USING LV_JSON.
  CALL METHOD CL_DEMO_OUTPUT=>DISPLAY_JSON
    EXPORTING
      JSON = LV_JSON.
ENDFORM.

FORM FRM_DISPLAY_DATA USING LV_DATA.
  CALL METHOD CL_DEMO_OUTPUT=>DISPLAY
    EXPORTING
      DATA = LV_DATA.
ENDFORM.

FORM FRM_DISPLAY_JSON_HTML USING LV_JSON.
  DATA: LV_CONVERT TYPE STRING,
        LV_ERR_TXT TYPE STRING.
  IF LV_JSON IS NOT INITIAL.
    TRY.
        CALL TRANSFORMATION SJSON2HTML SOURCE XML LV_JSON
                                       RESULT XML DATA(LV_HTML).
      CATCH CX_XSLT_RUNTIME_ERROR INTO DATA(LO_ERR).
        LV_ERR_TXT = LO_ERR->GET_TEXT( ).
        MESSAGE I001(00) WITH LV_ERR_TXT.
    ENDTRY.
    IF LV_ERR_TXT IS INITIAL.
      LV_CONVERT = CL_ABAP_CODEPAGE=>CONVERT_FROM( LV_HTML ).
      CL_ABAP_BROWSER=>SHOW_HTML( HTML_STRING = LV_CONVERT ).
    ENDIF.
  ENDIF.
ENDFORM.

FORM FRM_ABAP_JSON USING    DATA
                            LV_PRETTY_NAME    TYPE CHAR1
                            LV_COMPRESS       TYPE CHAR1
                            LV_NUMC_AS_STRING TYPE CHAR1
                   CHANGING LV_JSON.

  DATA: LW_NAME_MAPPING  TYPE /UI2/CL_JSON=>NAME_MAPPING,
        LT_NAME_MAPPINGS TYPE /UI2/CL_JSON=>NAME_MAPPINGS.

  DATA:
*        lv_compress         TYPE char1 VALUE ``,
    LV_NAME             TYPE STRING,
*        LV_PRETTY_NAME      TYPE CHAR1,
    LO_TYPE_DESCR       TYPE REF TO CL_ABAP_TYPEDESCR,
    LV_ASSOC_ARRAYS     TYPE CHAR1 VALUE ``,
    LV_TS_AS_ISO8601    TYPE CHAR1 VALUE ``,
    LV_EXPAND_INCLUDES  TYPE CHAR1 VALUE `X`,
    LV_ASSOC_ARRAYS_OPT TYPE CHAR1 VALUE ``,
*        LV_NUMC_AS_STRING   TYPE CHAR1 VALUE ``,
    LV_CONVERSION_EXITS TYPE CHAR1,
    LV_FORMAT_OUTPUT    TYPE CHAR1,
    LV_HEX_AS_BASE64    TYPE CHAR1 VALUE `X`.

  "LV_PRETTY_NAME L low_case X camel_case Y extended U user C user_low_case

  CLEAR: LV_JSON.
  LV_COMPRESS = 'X'.
  CALL METHOD /UI2/CL_JSON=>SERIALIZE
    EXPORTING
      DATA             = DATA
      COMPRESS         = LV_COMPRESS
      NAME             = LV_NAME
      PRETTY_NAME      = LV_PRETTY_NAME
      TYPE_DESCR       = LO_TYPE_DESCR
      ASSOC_ARRAYS     = LV_ASSOC_ARRAYS
      TS_AS_ISO8601    = LV_TS_AS_ISO8601
      EXPAND_INCLUDES  = LV_EXPAND_INCLUDES
      ASSOC_ARRAYS_OPT = LV_ASSOC_ARRAYS_OPT
      NUMC_AS_STRING   = LV_NUMC_AS_STRING
      NAME_MAPPINGS    = LT_NAME_MAPPINGS
      CONVERSION_EXITS = LV_CONVERSION_EXITS
*     format_output    = lv_format_output
*     hex_as_base64    = lv_hex_as_base64
    RECEIVING
      R_JSON           = LV_JSON.
ENDFORM.

FORM FRM_JSON_ABAP USING    LV_JSON
                            LV_PRETTY_NAME
                   CHANGING DATA.

  DATA: LW_NAME_MAPPING  TYPE /UI2/CL_JSON=>NAME_MAPPING,
        LT_NAME_MAPPINGS TYPE /UI2/CL_JSON=>NAME_MAPPINGS.

  DATA: LV_JSONX            TYPE XSTRING,
*        LV_PRETTY_NAME      TYPE CHAR1,
        LV_ASSOC_ARRAYS     TYPE CHAR1,
        LV_ASSOC_ARRAYS_OPT TYPE CHAR1,
        LV_CONVERSION_EXITS TYPE CHAR1,
        LV_HEX_AS_BASE64    TYPE CHAR1 VALUE `X`.

  CLEAR: DATA.
  CALL METHOD /UI2/CL_JSON=>DESERIALIZE
    EXPORTING
      JSON             = LV_JSON
      JSONX            = LV_JSONX
      PRETTY_NAME      = LV_PRETTY_NAME
      ASSOC_ARRAYS     = LV_ASSOC_ARRAYS
      ASSOC_ARRAYS_OPT = LV_ASSOC_ARRAYS_OPT
      NAME_MAPPINGS    = LT_NAME_MAPPINGS
      CONVERSION_EXITS = LV_CONVERSION_EXITS
*     hex_as_base64    = lv_hex_as_base64
    CHANGING
      DATA             = DATA.

ENDFORM.

FORM FRM_FDT_ABAP_JSON USING    DATA
                       CHANGING LV_JSON.
  CLEAR: LV_JSON.
  CALL METHOD CL_FDT_JSON=>DATA_TO_JSON
    EXPORTING
      IA_DATA = DATA
    RECEIVING
      RV_JSON = LV_JSON.
ENDFORM.

FORM FRM_FDT_JSON_ABAP USING    LV_JSON
                       CHANGING DATA.
  CLEAR: DATA.
  FREE: DATA.
  CALL METHOD CL_FDT_JSON=>JSON_TO_DATA
    EXPORTING
      IV_JSON = LV_JSON
    CHANGING
      CA_DATA = DATA.
ENDFORM.
https://api.deepseek.com/v1/chat/completions
API Response:
{"id":"0ab131b3-9ac6-41a6-b6fa-0c6b79cb5bbb","object":"chat.completion","created":1739241180,"model":"deepseek-chat","choices":[{"index":0,"message":{"role"

{"model":"deepseek-chat","messages":[{"role":"user","content":"ABAP写Hellor world!"}],"temperature":1.0}

{"id":"0ab131b3-9ac6-41a6-b6fa-0c6b79cb5bbb","object":"chat.completion","created":1739241180,"model":"deepseek-chat","choices":[{"index":0,"message":{"role"
~response_line HTTP/1.1 200 OK
~server_protocol HTTP/1.1
~status_code 200
~status_reason OK
date Tue, 11 Feb 2025 02:33:00 GMT
content-type application/json
set-cookie HWWAFSESID=6887288766169067ac; path=/
set-cookie HWWAFSESTIME=1739241179226; path=/
vary origin, access-control-request-method, access-control-request-headers
access-control-allow-credentials true
x-ds-trace-id 85e1da12b84a7c2cae3ec5fa4f6835c1
strict-transport-security max-age=31536000; includeSubDomains; preload
x-content-type-options nosniff
content-encoding gzip
server elb
transfer-encoding chunked
sap-original-protocol h2
get_cookies

HWWAFSESTIME
1739241179226
HWWAFSESID
6887288766169067ac

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐