ABAP小白开发操作手册+(九)ABAP调用http

news2024/9/23 23:35:46

开发类型:

新增ABAP通过调用http的方式来发送业务数据到其他系统

开发申请:

(这里业务的开发申请没写完整SAP对应外部系统字段的对应关系,没关系,我们可以看接口文档)

外围系统提供的接口文档:

(这一part的参数有点长,大家看看得了,不用太在意,把这个外围系统提供的参数列出来,只是为了体现参数的一些结构,方便大家对比后面我们在开发过程中,如何进行SAP参数的设置)

接口地址:

测试机: http://123456/rdmCalled/forSap/poInfo

正式机: http://123456/rdmCalled/forSap/poInfo

请求方式:

POST

入参类型:

["aplication/json"]

响应类型:

["application/json"]

请求参数:

入参示例:

{

        "detailInfoList": [

                 {

                         "count": 2,

                         "materialNo": "m001",

                        "materialName": "物料001",

                         "rowNo": "1",

                         "status": 1,

                         "taxRate": 0,

                         "totalPrice": 10,

                         "unitPrice": 5

                 }

        ],

        "orderDate": "2024-04-28 00:00:00",

        "poNo": "po001",

        "prNo": "pr001",

        "projectCode": "HKC20230524001"

}

响应状态:

状态码

说明

200

成功

500

异常

503

服务不正常

403

无权限

401

未登录

响应参数:

参数名称

参数说明

类型

schema

code

响应状态码 (成功200, 失败500)

integer(int32)

integer(int32)

data

需要返回的数据(该接口可忽略)

string

detailMsg

详细的消息内容,一般用于显示错误的原因

string

detailMsg

message

返回信息

string

show

在浏览器端的默认信息中是否显示(该接口可忽略)

boolean

success

是否成功

boolean

响应示例:

        成功:

{

  "success": true,

  "message": "添加PO单信息成功; PO单号【po001】",

  "detailMsg": "",

  "show": true,

  "code": 200,

  "data": null

}

        失败:

{

  "success": false,

  "message": "入参校验失败!",

  "detailMsg": "项目编号不能为空; ",

  "show": true,

  "code": 500,

  "data": null

}

开发步骤:

有点多,我先把代码粘贴上来

因为本质上还是接口,所以我们还是用事务代码SE37进行开发,进行导入导出参数的设置、源代码编写,今天太晚了,明天重新编辑一下

FUNCTION ZZMM_PO_TO_RDM_TEST.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(I_FRDAT) TYPE  FRGDT
*"     VALUE(I_EBELN) TYPE  EBELN
*"     VALUE(I_BANFN) TYPE  BANFN
*"     VALUE(I_ZZRDMNO) TYPE  ZERDMNO
*"  EXPORTING
*"     VALUE(E_RTYPE) TYPE  BAPI_MTYPE
*"     VALUE(E_RTYMSG) TYPE  BAPI_MSG
*"  TABLES
*"      T_DATA STRUCTURE  ZSMM0093
*"----------------------------------------------------------------------
  MACRO_SAVE_LOG_BEFORE_PROC.

  MACRO_SAVE_LOG_AFTER_PROC 'IN'.


  DATA LO_DATA TYPE REF TO DATA.
  DATA LV_ECS_JSON_REQ TYPE STRING.
  DATA: LV_ECS_JSON_RES TYPE STRING,
        LV_URL          TYPE STRING,
*        LV_URL          TYPE CHAR200,
        LV_MSG          TYPE STRING,
        LV_TYPE         TYPE BAPI_MTYPE.
  DATA GS_ECS_REQ TYPE zsMM0097.
  DATA GS_ECS_RET TYPE zsMM0098.
  DATA GT_ECS_INV_MAPPING TYPE /UI2/CL_JSON=>NAME_MAPPINGS.
  DATA GT_ECS_MAPPING_RET TYPE /UI2/CL_JSON=>NAME_MAPPINGS.

  GS_ECS_REQ-ORDERDATE = I_FRDAT.
  GS_ECS_REQ-PRNO = I_BANFN.
  GS_ECS_REQ-pOno = i_EBELN.
  GS_ECS_REQ-PROJECTCODE = I_ZZRDMNO.
  APPEND LINES OF t_DATA[] TO GS_ECS_REQ-DETAILS.

  LO_DATA = REF #( GS_ECS_REQ ).

  IF LO_DATA IS NOT BOUND.
    MACRO_SAVE_LOG_AFTER_PROC 'OUT'.
    RETURN.
  ENDIF.
  "获取接口地址:配置成后台表
  SELECT SINGLE * FROM ZTMMURL
    WHERE Zname = 'PO_URL_RDM'
    INTO @DATA(LS_ZTMMURL).
  IF LS_ZTMMURL-ZVAL IS INITIAL.
    E_RTYPE = 'E'.
    E_RTYMSG = '接口地址未配置,请到ZTMMURL表中配置接口地址'.
    MACRO_SAVE_LOG_AFTER_PROC 'OUT'.
    RETURN.
  ENDIF.
  LV_URL = CONV CHAR200( LS_ZTMMURL-ZVAL ).
  CONDENSE LV_URL NO-GAPS.
*设置JSON字符转换
  GT_ECS_INV_MAPPING = VALUE #(
  ( ABAP = 'DETAILS' JSON = 'detailInfoList'  )
( ABAP = 'BNFPO'  JSON = 'prRowNo' )
( ABAP = 'EBELP'  JSON = 'rowNo' )
( ABAP = 'MATNR'  JSON = 'materialNo' )
( ABAP = 'TXZ01'  JSON = 'materialName' )
( ABAP = 'LOEKZ'  JSON = 'status' )
( ABAP = 'NETPR'  JSON = 'unitPrice' )
( ABAP = 'BRTWR'  JSON = 'totalPrice' )
( ABAP = 'MENGE'  JSON = 'count' )
( ABAP = 'ORDERDATE'  JSON = 'orderDate' )
( ABAP = 'PONO'  JSON = 'poNo' )
( ABAP = 'PRNO'  JSON = 'prNo')
( ABAP = 'PROJECTCODE'  JSON = 'projectCode' )
     ).

  GT_ECS_MAPPING_RET = VALUE #(
     ( ABAP = 'code'         JSON = 'code')
     ( ABAP = 'data'         JSON = 'data')
     ( ABAP = 'detailmsg'    JSON = 'detailMsg')
     ( ABAP = 'message'      JSON = 'message')
     ( ABAP = 'show'         JSON = 'show')
     ( ABAP = 'success'      JSON = 'success')
     ).
*将ABAP数据转换为JSON格式
  CALL METHOD /UI2/CL_JSON=>SERIALIZE
    EXPORTING
      DATA          = LO_DATA
*     COMPRESS      = 'X'
      PRETTY_NAME   = /UI2/CL_JSON=>PRETTY_MODE-LOW_CASE
      NAME_MAPPINGS = GT_ECS_INV_MAPPING
    RECEIVING
      R_JSON        = LV_ECS_JSON_REQ.

*创建CLIENT
  DATA:lo_http_client TYPE REF TO if_http_client.
  DATA l_resp TYPE string.
DATA:tt_headfield TYPE TIHTTPNVP .
  CALL METHOD cl_http_client=>create_by_url
    EXPORTING
      url                = lv_url"API
    IMPORTING
      client             = lo_http_client
    EXCEPTIONS
      argument_not_found = 1
      plugin_not_active  = 2
      internal_error     = 3
      OTHERS             = 4.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO E_RTYMSG.
    E_RTYMSG = '创建client错误,错误信息: ' && E_RTYMSG.
    E_RTYPE  = 'E'.
    RETURN.
  ENDIF.

  lo_http_client->request->set_method('POST').

  CALL METHOD lo_http_client->request->if_http_entity~set_header_field
    EXPORTING
      name  = 'Content-Type'
      value = 'application/json'.

  IF tt_headfield[] IS NOT INITIAL.
    CALL METHOD lo_http_client->request->if_http_entity~set_header_fields
      EXPORTING
        fields = tt_headfield[].
  ENDIF.

  IF LV_ECS_JSON_REQ IS NOT INITIAL.
    DATA(l_conten_len) =  strlen( LV_ECS_JSON_REQ ).
    CALL METHOD lo_http_client->request->if_http_entity~set_cdata
      EXPORTING
        data   = LV_ECS_JSON_REQ
        offset = 0
        length = l_conten_len.
  ENDIF.
*发送请求
  CALL METHOD lo_http_client->send
    EXPORTING
      timeout                    = 300
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3
      http_invalid_timeout       = 4
      OTHERS                     = 5.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO E_RTYMSG.
    E_RTYMSG = '发送请求错误,错误信息: ' && E_RTYMSG.
    E_RTYPE  = 'E'.
    CALL METHOD lo_http_client->close.
    RETURN.
  ENDIF.
*返回请求
  CALL METHOD lo_http_client->receive
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3
      OTHERS                     = 4.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO  E_RTYMSG.
     E_RTYMSG = '返回请求错误,错误信息: ' &&  E_RTYMSG.
    e_Rtype = 'E'.
    CALL METHOD lo_http_client->close.
    RETURN.
  ENDIF.
*转换后的JSON字符串赋值
  CALL METHOD lo_http_client->response->if_http_entity~get_cdata
    RECEIVING
      data = l_resp.
      LV_ECS_JSON_RES = l_resp.
*关闭请求
  CALL METHOD lo_http_client->close.
*读取远程服务器返回的处理结果
    LO_DATA = REF #( GS_ECS_RET ).
    CALL METHOD /UI2/CL_JSON=>DESERIALIZE
      EXPORTING
        JSON          = LV_ECS_JSON_RES
        NAME_MAPPINGS = GT_ECS_MAPPING_RET
      CHANGING
        DATA          = LO_DATA.
    SEARCH LV_ECS_JSON_RES FOR 'false'.
    GS_ECS_RET-SUCCESS = XSDBOOL( SY-SUBRC NE 0 ).
    IF GS_ECS_RET-SUCCESS EQ ABAP_TRUE.
      E_RTYPE = 'S'.
    ELSE.
      E_RTYPE = 'E'.
    ENDIF.

    E_RTYMSG = GS_ECS_RET-MESSAGE.

  MACRO_SAVE_LOG_AFTER_PROC 'OUT'.

ENDFUNCTION.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1993571.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java之网络编程篇

前言 网络编程就是计算机和计算机之间通过网络进行数据传输&#xff0c;下面介绍一些概念和如何实现UDP和TCP两种模式的传输。 一、常见的软件架构C/S和B/S C/S架构需要一个客户端软件程序服务器 B/S只需要打开网页服务器 C/S架构的优缺点和应用场景 优点&#xff1a;画面可以…

看图学sql之sql的执行顺序

学完前面的内容&#xff0c;我们已经掌握了基本的sql语法了&#xff0c;那我们学的 select, distinct, from, where,group by, having, order by, limit 他们具体的执行顺序是什么样的呢&#xff1f; 语法&#xff1a; SELECT distinct column1, column2 FROM table1 join …

关系型数据库管理系统--MySQL

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

【经验总结】ShardingSphere5.2.1 + Springboot 快速开始

Sharding Sphere 官方文档地址&#xff1a; https://shardingsphere.apache.org/document/current/cn/overview/maven仓库&#xff1a;https://mvnrepository.com/artifact/org.apache.shardingsphere/shardingsphere-jdbc 官方的文档写的很详尽到位&#xff0c;这里会截取部分…

基于Retina+PFLD+CNN人脸关键点及表情识别

对图片/视频中的人脸进行检测&#xff0c;并绘制人脸框。然后对检测到的人脸进行关键点识别&#xff0c;并进行绘制。最后根据人脸关键点&#xff0c;裁剪出人脸&#xff0c;判断该人脸的表情。 基于此&#xff0c;分别使用retina进行人脸检测&#xff0c;PFLD进行人脸关键点识…

软硬链接详解

目录 一、软硬链接命令 二、特征 三、相关知识 一、软硬链接命令 ln -s target link_name-s&#xff1a;选项表示创建一个符号链接&#xff08;软链接&#xff09;&#xff0c;如果没有-s就是硬链接target&#xff1a;是要指向的目标文件或目录的路径。link_name&#xff1…

「HarmonyNextOS」页面路由跳转Router更换为Navigation

前言 前段时间&#xff0c;鸿蒙发布了HarmonyNextOS系统&#xff0c;API直接升级到了12&#xff0c;许多API都发生了改变&#xff0c;页面跳转页从当初推荐的Router变换成Navigation&#xff0c;并且从API Version 10之后&#xff0c;都推荐使用NavPathStack来实现页面路由&am…

Go语言项目实战班04 Go语言课程管理系统项目实战 20240807 课程笔记和上课代码

预览 课程特色 本教程录制于2024年8月8日&#xff0c;使用Go1.22版本&#xff0c;基于Goland2024进行开发&#xff0c;采用的技术栈比较新。 每节课控制在十分钟以内&#xff0c;课时精简&#xff0c;每节课都是一个独立的知识点&#xff0c;如果有遗忘&#xff0c;完全可以当…

【JavaEE】synchronized原理

目录 前言 synchronized特性 synchronized特点 synchronize的加锁过程 1.无锁-->偏向锁 2.偏向锁->轻量级锁 3.轻量级锁->重量级锁 锁的优化操作 1.锁消除 2.锁粗化 3.自适应自旋锁 相关面试题 1.什么是偏向锁&#xff1f; 2.synchronized的实现原理是什…

LVS原理及实例

目录 LVS原理 LVS概念 lvs集群的类型 lvs-nat 解释 传输过程 lvs-dr 解释 传输过程 特点 lvs-tun LVS&#xff08;Linux Virtual Server&#xff09;常见的调度算法 防火墙标记&#xff08;Firewall Marking&#xff09;结合轮询调度 实战案例 lvs的nat模式配置 …

代码随想录算法刷题训练营day49:LeetCode(42)接雨水、LeetCode(84)柱状图中最大的矩形

代码随想录算法刷题训练营day49&#xff1a;LeetCode(42)接雨水、LeetCode(84)柱状图中最大的矩形 LeetCode(42)接雨水 题目 代码 import java.util.Stack;class Solution {public int trap(int[] height) {//用单调栈进行操作int sum0;Stack<Integer> stacknew Stac…

计算机的错误计算(五十六)

摘要 展示大数的正切函数值的错误计算。 由计算机的错误计算&#xff08;五十五&#xff09;知&#xff0c;国际IEEE 754 标准给出的正切函数的定义域是整个实数域范围。那么&#xff0c;在该范围内&#xff0c;软件的计算效果如何呢&#xff1f; 例1. 计算 . 在 Python下计…

字体识别验证码的介绍!

字体识别验证码 ​是一种安全机制&#xff0c;‌通过要求用户识别特定字体来验证用户的身份或防止自动化攻击。‌这种验证码通常包含一些经过特殊设计的字符&#xff0c;‌需要用户根据这些字符的特定样式&#xff08;‌如字体、‌字形等&#xff09;‌来进行识别和输入。‌字…

html+css网页制作 博云丝网5个页面 无js ui还原度100%

htmlcss网页制作 博云丝网5个页面 无js ui还原度100% 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取…

el-tree限制选中个数

el-tree限制选中个数 <el-treestyle"max-width: 600px":data"Treedata":check-strictly"true"show-checkboxnode-key"id":props"defaultProps":default-expanded-keys"[1, 2]"ref"treeRef"check&quo…

Java数组类型

目录 一维数组 一维数组的声明 动态数组初始化 静态数组的初始化 一维数组的访问 数组长度 数组的遍历操作 数组中的默认值 数组中的两个常见异常 越界访问异常ArrayIndexOutOfBoundsException 空指针异常NullPointerException Java中的内存划分 一维数组的内存分…

pdf怎么加密码怎么设置密码?pdf加密码的几种设置方法

在数字化时代&#xff0c;信息的保密性与安全性日益成为我们不可忽视的重要环节。尤其对于包含敏感信息或个人隐私的PDF文档而言&#xff0c;保护其免受未授权访问的侵扰显得尤为重要。通过为PDF文档设置密码保护&#xff0c;我们能够筑起一道坚实的防线&#xff0c;确保只有拥…

危化品安全生产风险监测预警系统的构建与实施

引言 1、背景与重要性 在现代工业生产中&#xff0c;危险化学品&#xff08;简称“危化品”&#xff09;的使用和管理日益广泛。它们在化工、制药、能源等多个领域中扮演着不可或缺的角色。然而&#xff0c;危化品因其固有的易燃、易爆、腐蚀、有毒等特性&#xff0c;一旦管理…

Git使用错误分析

一.fatal: Pathspec is in submodule 我做了这样的错误操作&#xff0c;在一个仓库下的一个子目录&#xff0c;执行了git init 创建了一个子仓库&#xff0c;然后想删掉这个子仓库&#xff0c;就只删除了该子目录下的.git文件夹&#xff0c;而没有删除缓存&#xff0c;执行如下…

java: Internal error in the mapping processor: java.lang.NullPointerExceptio

java: Internal error in the mapping processor: java.lang.NullPointerExceptio 解决办法&#xff1a;idea里面加参数-Djps.track.ap.dependenciesfalse即可