SAP ABAP restful复杂结构发送图片,multipart/FORM-DATA参数存放数据

这个问题困扰了我很久。

这个是POSTMAN下发参数的截图,jpeg跟 jpg是一个类型。

粗略版我写在了一个方法里:

  METHOD SET_ATTACH.

    DATA: HTTP_CLIENT_DATA TYPE REF TO IF_HTTP_CLIENT,
          IV_URL           TYPE STRING, "调用地址
          LV_LEN           TYPE I,      "发送报文长度
          LV_JSON_STR      TYPE STRING, "需要发送的json报文
          LV_RESPON        TYPE STRING. "返回的报文
    DATA:PART TYPE REF TO IF_HTTP_ENTITY.
    "URL地址
**** formulario
    DATA: IT_FORMULARIO TYPE TIHTTPNVP,
          WA_FORMULARIO LIKE LINE OF IT_FORMULARIO.  "传输FORM-DATA
    TYPES:BEGIN OF TY_ACHEMENT,
            SOURCE    TYPE STRING,
            ATTNAME   TYPE STRING,
            ATTTYPE   TYPE STRING,
            ATTOBJ    TYPE XSTRING,
            MEDIATYPE TYPE STRING,
          END OF TY_ACHEMENT.
    DATA :GT_ACHEMENT TYPE  TABLE OF TY_ACHEMENT.
    DATA :GS_ACHEMENT TYPE   TY_ACHEMENT.  "用于发送电子附件
    DATA  LV_SOURCE TYPE STRING  .
    DATA  LV_ATTNAME TYPE STRING .
    DATA  LV_ATTTYPE TYPE STRING .
    DATA  LV_VALUE TYPE STRING.

**********************************************************************

*这个表里存放的是二进制数据流,我们平常可以通过图片上载函数,和 *SCMS_BINARY_TO_XSTRING函数转成二进制流,发送给对方。


    DATA LT_ZPICTABLE TYPE TABLE OF  ZPICTABLE.
    DATA OUTPUT TYPE STRING.
    SELECT * FROM ZPICTABLE INTO TABLE  LT_ZPICTABLE.
    READ TABLE LT_ZPICTABLE INTO DATA(LS_AA) INDEX 1.

**********************************************************************
    GS_ACHEMENT-SOURCE = 'SAP'.
    GS_ACHEMENT-ATTNAME = '1.jpeg'.
    GS_ACHEMENT-ATTTYPE = 'jpeg'.
    GS_ACHEMENT-ATTOBJ = LS_AA-FIELD1.  "文件流
    GS_ACHEMENT-MEDIATYPE = 'multipart/form-data'.
    APPEND GS_ACHEMENT TO GT_ACHEMENT.
*  IV_REQUEST_SET_ATTACH = /UI2/CL_JSON=>SERIALIZE( DATA = GT_ACHEMENT ).

    DATA  LV_ATTOBJ TYPE STRING.

    LV_SOURCE = 'form-data; name="' &&  'requestParamMap' && '[' && '''' &&  'source'  && '''' && ']' && '";'.
    LV_ATTNAME = 'form-data; name="' && 'requestParamMap' && '[' && '''' &&  'attName'  && '''' && ']' && '";'.
    LV_ATTTYPE = 'form-data; name="' && 'requestParamMap' && '[' && '''' &&  'attType'  && '''' && ']' && '";'.
    LV_ATTOBJ = 'multipartFileMap' && '[' && '''' &&  'attObj'  && '''' && ']'.
**给FORM-DATA赋值
*    WA_FORMULARIO-NAME = LV_SOURCE.
*    WA_FORMULARIO-VALUE = GS_ACHEMENT-SOURCE. "来源系统
*    APPEND WA_FORMULARIO TO IT_FORMULARIO.
*
*    WA_FORMULARIO-NAME = LV_ATTNAME.
*    WA_FORMULARIO-VALUE = GS_ACHEMENT-ATTNAME.  "附件名
*    APPEND WA_FORMULARIO TO IT_FORMULARIO.
*
*    WA_FORMULARIO-NAME = LV_ATTTYPE.
*    WA_FORMULARIO-VALUE = GS_ACHEMENT-ATTTYPE. "扩展名
*    APPEND WA_FORMULARIO TO IT_FORMULARIO.
*
**    WA_FORMULARIO-NAME = LV_ATTOBJ.
**    WA_FORMULARIO-VALUE = LS_AA-FIELD1. "文件流
**    APPEND WA_FORMULARIO TO IT_FORMULARIO.
*
*    WA_FORMULARIO-NAME = 'mediaType'.
*    WA_FORMULARIO-VALUE = 'multipart/form-data'.
*    APPEND WA_FORMULARIO TO IT_FORMULARIO.
*
*    WA_FORMULARIO-NAME = 'content-disposition'.
*    WA_FORMULARIO-VALUE = `form_data;name="1";filename="1.jpg"`.
*    APPEND WA_FORMULARIO TO IT_FORMULARIO.

*  REPLACE 'SOURCE' WITH LV_SOURCE INTO IV_REQUEST_SET_ATTACH.
*  REPLACE 'ATTNAME' WITH LV_ATTNAME INTO IV_REQUEST_SET_ATTACH.
*  REPLACE 'ATTTYPE' WITH LV_ATTTYPE INTO IV_REQUEST_SET_ATTACH.
*  REPLACE 'ATTOBJ' WITH LV_ATTOBJ INTO IV_REQUEST_SET_ATTACH.
*  REPLACE 'MEDIATYPE' WITH 'mediaType' INTO IV_REQUEST_SET_ATTACH.

*  IV_REQUEST_SET_ATTACH = TO_LOWER( IV_REQUEST_SET_ATTACH ) .


    CASE SY-SYSID.
      WHEN 'ED6'.
        "* 测试机
        IV_URL = 'xxx'.
        "创建客户端请求
      WHEN 'EP1'.
        "* 生成机
        IV_URL = 'as'.
      WHEN OTHERS.
    ENDCASE.

    "创建实例
    CALL METHOD CL_HTTP_CLIENT=>CREATE_BY_URL
      EXPORTING
        URL    = IV_URL
      IMPORTING
        CLIENT = HTTP_CLIENT_DATA.

    "设定传输请求内容格式以及编码格式
    CALL METHOD HTTP_CLIENT_DATA->REQUEST->SET_HEADER_FIELD
      EXPORTING
        NAME  = 'Content-Type'
        VALUE = 'multipart/form-data'.


    CALL METHOD HTTP_CLIENT_DATA->REQUEST->SET_HEADER_FIELD
      EXPORTING
        NAME  = 'Authorization'
        VALUE = IV_TOKEN.

    "设定调用服务
    HTTP_CLIENT_DATA->REQUEST->SET_METHOD( IF_HTTP_REQUEST=>CO_REQUEST_METHOD_POST ).

    PART = HTTP_CLIENT_DATA->REQUEST->IF_HTTP_ENTITY~ADD_MULTIPART( ).

**给FORM-DATA 填充参数
    CLEAR LV_VALUE.
    "form-data "来源系统

    CALL METHOD PART->SET_HEADER_FIELD
      EXPORTING
        NAME  = 'content-disposition'
        VALUE = LV_SOURCE.
  "form-data value值
    CALL METHOD PART->APPEND_CDATA
      EXPORTING
        DATA = 'SAP'.

  part = HTTP_CLIENT_DATA->REQUEST->IF_HTTP_ENTITY~ADD_MULTIPART( ).
  "附件名
    CALL METHOD PART->SET_HEADER_FIELD
      EXPORTING
        NAME  = 'content-disposition'
        VALUE = LV_ATTNAME.
  "form-data value值
    CALL METHOD PART->APPEND_CDATA
      EXPORTING
        DATA = '1.jpeg'.

  part = HTTP_CLIENT_DATA->REQUEST->IF_HTTP_ENTITY~ADD_MULTIPART( ).
  "扩展名
    CALL METHOD PART->SET_HEADER_FIELD
      EXPORTING
        NAME  = 'content-disposition'
        VALUE = LV_ATTTYPE.
  "form-data value值
    CALL METHOD PART->APPEND_CDATA
      EXPORTING
        DATA = 'jpeg'.

  part = HTTP_CLIENT_DATA->REQUEST->IF_HTTP_ENTITY~ADD_MULTIPART( ).

    CALL METHOD PART->SET_HEADER_FIELD
      EXPORTING
        NAME  = 'content-disposition'
        VALUE = 'form-data; name="mediaType";'.
  "form-data value值
    CALL METHOD PART->APPEND_CDATA
      EXPORTING
        DATA = 'multipart/form-data'.
*    PART = HTTP_CLIENT_DATA->REQUEST->IF_HTTP_ENTITY~ADD_MULTIPART( ).
*
**给FORM-DATA 填充参数
*    PART = HTTP_CLIENT_DATA->REQUEST->IF_HTTP_ENTITY~ADD_MULTIPART( ).
*    CALL METHOD PART->SET_HEADER_FIELDS
*      EXPORTING
*        FIELDS = IT_FORMULARIO.

* 转二进制
*  CALL METHOD lo_http_client->request->if_http_entity~set_formfield_encoding
*    EXPORTING
*      formfield_encoding = cl_http_request=>if_http_entity~co_encoding_raw.
*  "文件
  PART = HTTP_CLIENT_DATA->request->if_http_entity~add_multipart( ).

  CALL METHOD PART->set_header_field
    EXPORTING
      name  = 'content-disposition'
      value = `form-data;name="multipartFileMap['attObj']";filename="1.jpeg";`.
    "对应jpeg/jpg类型
    CALL METHOD PART->SET_CONTENT_TYPE
      EXPORTING
        CONTENT_TYPE = 'application/x-jpg-compressed'.
*        CONTENT_TYPE = 'image/jpeg'.

*FORM-DATA塞数据
    LV_LEN = XSTRLEN( LS_AA-FIELD1 ).
    CALL METHOD PART->SET_DATA
      EXPORTING
        DATA   = LS_AA-FIELD1
        OFFSET = 0
        LENGTH = LV_LEN.

    "设置待传输内容
    CALL METHOD HTTP_CLIENT_DATA->SEND
      EXCEPTIONS
        HTTP_COMMUNICATION_FAILURE = 1
        HTTP_INVALID_STATE         = 2.
    IF SY-SUBRC <> 0.
      "操作失败,获取失败原因
      HTTP_CLIENT_DATA->GET_LAST_ERROR( IMPORTING MESSAGE = EV_MESG ).
      EV_MESGTYP = 'E'.
      EXIT.
    ENDIF.

    "读取远程服务返回的处理过结果。
    CALL METHOD HTTP_CLIENT_DATA->RECEIVE
      EXCEPTIONS
        HTTP_COMMUNICATION_FAILURE = 1
        HTTP_INVALID_STATE         = 2
        HTTP_PROCESSING_FAILED     = 3.
    IF SY-SUBRC <> 0 .
      HTTP_CLIENT_DATA->GET_LAST_ERROR( IMPORTING MESSAGE = EV_MESG ).
      EV_MESGTYP = 'E'.
    ELSE.
      "读取返回返回内容
      CLEAR LV_RESPON.
      LV_RESPON = HTTP_CLIENT_DATA->RESPONSE->GET_CDATA( ).
      LV_RESPON = '[' && LV_RESPON && ']'.
      BREAK-POINT.
*    /UI2/CL_JSON=>DESERIALIZE( EXPORTING JSON = LV_RESPON  CHANGING DATA = LT_REV ).
      EV_MESGTYP = 'S'.
    ENDIF.


  ENDMETHOD.

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你叶不叶

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值