restful实践二(sap调用第三方)


*-----定义
TYPES:BEGIN OF ty_invoicelist,
        goodsname     TYPE   string,                             "商品名称
        specification TYPE   string,                             "商品规格
        unit          TYPE   string,                             "单位
        quantity(8)   TYPE   p DECIMALS 8,                       "数量
*        unitprice(8)  TYPE   p DECIMALS 8,                       "单价
        unitprice     TYPE  string,                       "单价
        amount(8)     TYPE   p DECIMALS 2,                       "净值
        taxamount(8)  TYPE   p DECIMALS 2,                       "税金
        taxrate(8)    TYPE   p DECIMALS 2,                       "增值税税率
        taxsign       TYPE   integer,                            "含税标记
        revenuecode   TYPE   string,                             "税收分类编码
      END OF ty_invoicelist.

DATA:BEGIN OF lv_input,
       externaldocumentno   TYPE  string,                         "订单号
       taxno                TYPE  string,                         "销方税号
       purchasername        TYPE  string,                         "购方名称
       purchaseremail       TYPE  string,                         "购方邮箱
       invoicetype          TYPE  integer,                        "发票种类
       logisticsflag        TYPE  integer,                        "是否邮寄
       directinv            TYPE  integer,                        "是否直接开票
       manualsplitting      TYPE  integer,                        "是否手工拆单
       purchasertaxno       TYPE   string,                        "购方税号
       remark               TYPE   string,                        "发票备注
       purchaserbankaccount TYPE   string,                        "全电购方银行账号
       purchaserbankname    TYPE   string,                        "购方银行账户
       purchasertel         TYPE   string,                        "全电购方电话
       purchaseraddress     TYPE   string,                        "购方地址电话
       details              TYPE  TABLE OF ty_invoicelist,        "发票信息List
     END OF lv_input,

     lo_http_client  TYPE  REF TO if_http_client,
     lv_url          TYPE  string,                                "http 服务接口地址
     lv_access_token TYPE  string,
     lv_tax_token    TYPE  string,
     lv_serial_toten TYPE  string,
     zflag           TYPE  c,                                     "报错标志
     lt_fields       TYPE  TABLE OF string,
     lv_fieldname    TYPE  slis_fieldname,
     lv_fieldtext    TYPE  slis_fieldname,
     ls_invoicelist  TYPE  ty_invoicelist,
     lt_invoicelist  TYPE  TABLE OF ty_invoicelist,
     lv_request      TYPE  string,
     lv_message      TYPE  string,
     lv_code         TYPE  sysubrc,
     lv_resp         TYPE  string,

     BEGIN OF ls_output,
       code     TYPE string,
       message  TYPE string,
       serialno TYPE string,
       data     TYPE boolean,
     END OF ls_output,

     lv_len TYPE  i.                                               "发送报文长度


*-----------------------------------------------------准备--------------------------------------------------*
*-----------------------------------------------------------------------------------------------------------*

*&-------获取数据(必填校验)

"X-Access-Token 令牌
SELECT SINGLE token FROM zrtfit142 INTO lv_access_token WHERE udate >= sy-datum .
IF sy-subrc <> 0.
  PERFORM frm_msg USING 'E' l_logid '令牌在表zrtfit142中不存在'  CHANGING e_msg-type
                                                                          e_msg-logid
                                                                          e_msg-message.
ENDIF.

LOOP AT i_itab INTO DATA(ls_itab) .
  IF ls_itab-zlsdbh IS  INITIAL.
    PERFORM frm_msg USING 'E' l_logid '流水单编号不能为空!' CHANGING e_msg-type
                                                                      e_msg-logid
                                                                      e_msg-message.
    RETURN.
  ENDIF.
  IF ls_itab-zdjrq IS  INITIAL.
    PERFORM frm_msg USING 'E' l_logid '单据日期不能为空!'    CHANGING e_msg-type
                                                                      e_msg-logid
                                                                      e_msg-message.
    RETURN.
  ENDIF.
  IF ls_itab-zsellertaxno IS  INITIAL.
    PERFORM frm_msg USING 'E' l_logid '销方税号不能为空!'    CHANGING e_msg-type
                                                                       e_msg-logid
                                                                       e_msg-message.
    RETURN.
  ENDIF.
  IF ls_itab-zbuyername IS  INITIAL.
    PERFORM frm_msg USING 'E' l_logid '购方名称不能为空!'    CHANGING e_msg-type
                                                                       e_msg-logid
                                                                       e_msg-message.
    RETURN.
  ENDIF.
  IF ls_itab-zemil IS  INITIAL.
    PERFORM frm_msg USING 'E' l_logid '电子邮箱不能为空!'    CHANGING e_msg-type
                                                                       e_msg-logid
                                                                       e_msg-message.
    RETURN.
  ENDIF.
  IF ls_itab-maktx IS  INITIAL.
    PERFORM frm_msg USING 'E' l_logid '商品描述(短文本)不能为空!'  CHANGING e_msg-type
                                                                               e_msg-logid
                                                                               e_msg-message.
    RETURN.
  ENDIF.
  IF ls_itab-mspec IS  INITIAL.
    PERFORM frm_msg USING 'E' l_logid '商品规格不能为空!'            CHANGING e_msg-type
                                                                               e_msg-logid
                                                                               e_msg-message.
    RETURN.
  ENDIF.
  IF ls_itab-taxamt IS  INITIAL.
    PERFORM frm_msg USING 'E' l_logid '税金不能为空!'                CHANGING e_msg-type
                                                                               e_msg-logid
                                                                               e_msg-message.
    RETURN.
  ENDIF.
  IF ls_itab-taxrate IS  INITIAL.
    PERFORM frm_msg USING 'E' l_logid '增值税税率不能为空!'          CHANGING e_msg-type
                                                                               e_msg-logid
                                                                               e_msg-message.
    RETURN.
  ENDIF.
  IF ls_itab-zbuyertaxno IS  INITIAL.
    PERFORM frm_msg USING 'E' l_logid '购方税号不能为空!'            CHANGING e_msg-type
                                                                               e_msg-logid
                                                                               e_msg-message.
    RETURN.
  ENDIF.
  IF ls_itab-zbuyeraddr IS  INITIAL.
    PERFORM frm_msg USING 'E' l_logid '购方地址电话不能为空!'        CHANGING e_msg-type
                                                                               e_msg-logid
                                                                               e_msg-message.
    RETURN.
  ENDIF.
  IF ls_itab-zbuyeracct IS  INITIAL.
    PERFORM frm_msg USING 'E' l_logid '购方银行账户不能为空!'        CHANGING e_msg-type
                                                                               e_msg-logid
                                                                               e_msg-message.
    RETURN.
  ENDIF.
ENDLOOP.

IF e_msg-type  <> 'E'.

*&-------设置http接口地址
  lv_url = 'https:*‘.

*&------创建客户端请求
  CALL METHOD cl_http_client=>create_by_url
    EXPORTING
      url                = lv_url
    IMPORTING
      client             = lo_http_client
    EXCEPTIONS
      argument_not_found = 1
      plugin_not_active  = 2
      internal_error     = 3
      OTHERS             = 4.
  IF sy-subrc <> 0.
    e_msg-type = 'E'.
    e_msg-message = '创建http代理出错'.
    e_msg-logid   = l_logid.
    EXIT.
  ENDIF.

*&-----不显示登录界面
  lo_http_client->propertytype_logon_popup = lo_http_client->co_disabled.

*&----- 设置content type和character set
  lo_http_client->request->set_content_type( content_type = 'application/json; charset=utf-8' ).

*&------设置方法为 post
  lo_http_client->request->set_method( if_http_request=>co_request_method_post ).

*&-------参数赋值

  CLEAR:ls_itab.
  READ TABLE i_itab INTO ls_itab INDEX 1.
  IF sy-subrc = 0.
    lv_tax_token                                  = ls_itab-zsellertaxno.
    lv_serial_toten                               = ls_itab-zlsdbh.
    lv_input-externaldocumentno                   = ls_itab-zlsdbh.
    lv_input-taxno                                = ls_itab-zsellertaxno.
    lv_input-purchasername                        = ls_itab-zbuyername.
    lv_input-purchaseremail                       = ls_itab-zemil.
    IF ls_itab-zfplxdm IS INITIAL .
      lv_input-invoicetype                        = '8'.
    ELSE.
      IF ls_itab-zfplxdm = '006'.
        lv_input-invoicetype                      = '8'.
      ELSEIF  ls_itab-zfplxdm = '005'.
        lv_input-invoicetype                      = '7'.
      ELSEIF  ls_itab-zfplxdm = '004'.
        lv_input-invoicetype                      = '1'.
      ELSEIF  ls_itab-zfplxdm = '007'.
        lv_input-invoicetype                      = '2'.
      ENDIF.

    ENDIF.
    lv_input-logisticsflag                      = '0'.
    lv_input-directinv                          = '0'.
    lv_input-manualsplitting                    = '0'.
    lv_input-purchasertaxno                     = ls_itab-zbuyertaxno.
*    SPLIT ls_itab-zbuyeraddr AT '' INTO lv_input-purchaseraddress    lv_input-purchasertel.
*    SPLIT ls_itab-zbuyeracct AT '' INTO lv_input-purchaserbankname   lv_input-purchaserbankaccount.
    lv_input-purchaseraddress                   = ls_itab-zbuyeraddr .
    lv_input-purchasertel                       = ls_itab-zgfdh.
    lv_input-purchaserbankname                  = ls_itab-zbuyeracct .
    lv_input-purchaserbankaccount               = ls_itab-zgfkzh.
    lv_input-remark                             = ls_itab-zremarks.

  ENDIF.

  CLEAR:ls_itab.
  LOOP AT i_itab INTO ls_itab.
    ls_invoicelist-goodsname                      = ls_itab-maktx.
    ls_invoicelist-specification                  = ls_itab-mspec.
    ls_invoicelist-unit                           = ls_itab-meins.
    ls_invoicelist-quantity                       = ls_itab-fkimg.
    ls_invoicelist-amount                         = ls_itab-ztzhje.
    ls_invoicelist-taxamount                      = ls_itab-ztzhse.

    SELECT SINGLE zssflbm INTO ls_invoicelist-revenuecode FROM zrtfit143 WHERE matkl = ls_itab-matkl.

    IF ls_itab-taxrate IS INITIAL.
*      SELECT SINGLE taxrate
*        INTO ls_invoicelist-taxrate
*        FROM zrtfit129 AS z
*       INNER JOIN zrtfit143 AS r ON r~wgbez = z~maktx
*       WHERE z~maktx   = ls_itab-maktx
*         AND r~zssflbm = ls_invoicelist-revenuecode.
    ELSE.
      ls_invoicelist-taxrate                         = ls_itab-taxrate.
    ENDIF.

    IF ls_itab-zhsbz IS INITIAL .
      ls_invoicelist-taxsign                         = '0'.
    ELSE.
      ls_invoicelist-taxsign                         = ls_itab-zhsbz.
    ENDIF.

    APPEND ls_invoicelist TO lt_invoicelist.
    CLEAR:ls_invoicelist.

    lv_input-details                                 =  lt_invoicelist.
  ENDLOOP.

*&-----X-Access-Token
  lo_http_client->request->if_http_entity~set_header_field(
  EXPORTING
    name  = 'X-Access-Token'
    value = lv_access_token
    ).

*&-----X-Tax-Token
  lo_http_client->request->if_http_entity~set_header_field(
  EXPORTING
    name  = 'X-Tax-Token'
    value = lv_tax_token
    ).

*&-----X-Serial-Token
  lo_http_client->request->if_http_entity~set_header_field(
  EXPORTING
    name  = 'X-Serial-Token'
    value = lv_serial_toten
    ).

*&-------数据格式转换 DATA-->JSON
  /ui2/cl_json=>serialize(
  EXPORTING
  data        = lv_input
        compress    = abap_false
        RECEIVING
        r_json     = lv_request
        ).

  "大小写转换
  REPLACE ALL OCCURRENCES OF 'EXTERNALDOCUMENTNO'   IN lv_request WITH 'externalDocumentNo'.
  REPLACE ALL OCCURRENCES OF 'TAXNO'                IN lv_request WITH 'taxNo'.
  REPLACE ALL OCCURRENCES OF 'PURCHASERNAME'        IN lv_request WITH 'purchaserName'.
  REPLACE ALL OCCURRENCES OF 'PURCHASEREMAIL'       IN lv_request WITH 'purchaserEmail'.
  REPLACE ALL OCCURRENCES OF 'INVOICETYPE'          IN lv_request WITH 'invoiceType'.
  REPLACE ALL OCCURRENCES OF 'LOGISTICSFLAG'        IN lv_request WITH 'logisticsFlag'.
  REPLACE ALL OCCURRENCES OF 'DIRECTINV'            IN lv_request WITH 'directInv'.
  REPLACE ALL OCCURRENCES OF 'MANUALSPLITTING'      IN lv_request WITH 'manualSplitting'.
  REPLACE ALL OCCURRENCES OF 'PURCHASERtaxNo'       IN lv_request WITH 'purchaserTaxNo'.
  REPLACE ALL OCCURRENCES OF 'REMARK'               IN lv_request WITH 'remark'.
  REPLACE ALL OCCURRENCES OF 'PURCHASERBANKACCOUNT' IN lv_request WITH 'purchaserBankAccount'.
  REPLACE ALL OCCURRENCES OF 'PURCHASERBANKNAME'    IN lv_request WITH 'purchaserBankName'.
  REPLACE ALL OCCURRENCES OF 'PURCHASERTEL'         IN lv_request WITH 'purchaserTel'.
  REPLACE ALL OCCURRENCES OF 'PURCHASERADDRESS'     IN lv_request WITH 'purchaserAddress'.
  REPLACE ALL OCCURRENCES OF 'DETAILS'              IN lv_request WITH 'details'.
  REPLACE ALL OCCURRENCES OF 'GOODSNAME'            IN lv_request WITH 'goodsName'.
  REPLACE ALL OCCURRENCES OF 'SPECIFICATION'        IN lv_request WITH 'specification'.
  REPLACE ALL OCCURRENCES OF 'UNIT'                 IN lv_request WITH 'unit'.
  REPLACE ALL OCCURRENCES OF 'QUANTITY'             IN lv_request WITH 'quantity'.
  REPLACE ALL OCCURRENCES OF 'unitPRICE'            IN lv_request WITH 'unitPrice'.
  REPLACE ALL OCCURRENCES OF 'AMOUNT'               IN lv_request WITH 'amount'.
  REPLACE ALL OCCURRENCES OF 'TAXamount'            IN lv_request WITH 'taxAmount'.
  REPLACE ALL OCCURRENCES OF 'TAXRATE'              IN lv_request WITH 'taxRate'.
  REPLACE ALL OCCURRENCES OF 'TAXSIGN'              IN lv_request WITH 'taxSign'.
  REPLACE ALL OCCURRENCES OF 'REVENUECODE'          IN lv_request WITH 'revenueCode'.


*&------设置待传输内容
  lv_len = strlen( lv_request ).
  CALL METHOD lo_http_client->request->set_cdata
    EXPORTING
      data   = lv_request
      offset = 0
      length = lv_len.

*-----------------------------------------------------发送--------------------------------------------------*
*-----------------------------------------------------------------------------------------------------------*
*&--------- 发送请求
  lo_http_client->send(
  EXCEPTIONS
    http_communication_failure = 1                  " Communication Error
    http_invalid_state         = 2                  " Invalid state
    http_processing_failed     = 3                  " Error when processing method
    http_invalid_timeout       = 4                  " Invalid Time Entry
    OTHERS                     = 5
    ).
  IF sy-subrc <> 0.
    lo_http_client->get_last_error( IMPORTING message = lv_message  code = lv_code ).
    e_msg-type    = 'E'.
    e_msg-message = lv_message.
    e_msg-logid   = l_logid.
    EXIT.
  ENDIF.

*-----------------------------------------------------接收--------------------------------------------------*
*-----------------------------------------------------------------------------------------------------------*
*&--------- 读取远程服务返回的结果消息
  lo_http_client->receive(
  EXCEPTIONS
    http_communication_failure = 1                " Communication Error
    http_invalid_state         = 2                " Invalid state
    http_processing_failed     = 3                " Error when processing method
    OTHERS                     = 4
    ).
  IF sy-subrc <> 0.
    lo_http_client->get_last_error( IMPORTING message = lv_message code = lv_code  ).
    e_msg-type = 'E'.
    e_msg-message = lv_message.
    e_msg-logid   = l_logid.
    EXIT.
  ELSE.
*&-------读取返回返回内容
    CLEAR lv_resp.
    lv_resp = lo_http_client->response->get_cdata( ).

*&-------将字符串中的回车符替换,否则abap将会识别为#
    REPLACE ALL OCCURRENCES OF REGEX '\n' IN lv_resp WITH space.

*&-------反序列化
    /ui2/cl_json=>deserialize(
    EXPORTING
      json               =   lv_resp                 " JSON string
    CHANGING
    data                 =   ls_output           " Data to serialize
          ).

*&-------处理接口返回数据
    IF ls_output-code = '200' .
      e_msg-type = 'S'.
      e_msg-message = '流水导入成功:' && ls_itab-zlsdbh  && ls_output-message.
    ELSE .
      e_msg-type = 'E'.
      e_msg-message = '流水导入失败:' && ls_itab-zlsdbh && ls_output-message.
    ENDIF .
    e_msg-logid = l_logid.

  ENDIF.
ENDIF.

在Java后端调用第三方RESTful接口,你可以使用Java的HTTP客户端库来发送HTTP请求。以下是一个简单的示例代码,演示如何使用Apache HttpClient库发送GET请求: ```java import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; import java.io.IOException; public class RestApiClient { public static void main(String[] args) { CloseableHttpClient httpClient = HttpClientBuilder.create().build(); String url = "https://api.example.com/endpoint"; // 替换为目标接口的URL HttpGet httpGet = new HttpGet(url); try { HttpResponse response = httpClient.execute(httpGet); int statusCode = response.getStatusLine().getStatusCode(); String responseBody = EntityUtils.toString(response.getEntity()); System.out.println("Status code: " + statusCode); System.out.println("Response body: " + responseBody); } catch (IOException e) { e.printStackTrace(); } finally { try { httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } } } ``` 上述代码中,我们使用了Apache HttpClient库来创建一个HTTP客户端,并构造了一个GET请求。然后,我们使用这个客户端发送请求,并获取响应的状态码和响应体。最后,记得关闭HTTP客户端。 这只是一个简单的示例,你可以根据实际需求进行定制化开发,例如添加请求头、传递请求参数等。请注意,这只是其中一种实现方式,还有其他的HTTP客户端库可供选择,如OkHttp、Spring RestTemplate等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值