通過api獲取數據


今天是個娛樂的節日,學點新東西,如下:

突發奇想想要使用abap去獲取個網站上公布的api,然后顯示一下

就當最近學習NEPTUNE的小練習吧

blob.png

百度一下獲取疫情的網站API,也可以自己去tianapi申請,

METHOD init.
    url = 'http://api.tianapi.com/txapi/ncovabroad/index?key=****************************'.
    "創建http客戶端
    CALL METHOD cl_http_client=>create_by_url
      EXPORTING
        url                = url
      IMPORTING
        client             = http_client
      EXCEPTIONS
        argument_not_found = 1
        plugin_not_active  = 2
        internal_error     = 3
        OTHERS             = 4.
    "設置http method 為Get
*  設定傳輸請求內容格式以及編碼格式
    http_client->request->set_content_type( 

        content_type = 'application/json; charset=utf-8' ).
*  設定調用服務
    http_client->request->set_method( 

        if_http_request=>co_request_method_get ).
    "發送
    CALL METHOD http_client->send
      EXCEPTIONS
        http_communication_failure = 1
        http_invalid_state         = 2
        http_processing_failed     = 3
        http_invalid_timeout       = 4
        OTHERS                     = 5.
    "接收
    CALL METHOD http_client->receive
      EXCEPTIONS
        http_communication_failure = 1
        http_invalid_state         = 2
        http_processing_failed     = 3.

    "獲取接口返回的數據
    DATA(json_result) = http_client->response->get_cdata( ).
    DATA lr_data TYPE REF TO data.
    DATA lr_data_t TYPE REF TO data."table
    FIELD-SYMBOLS:
      <table>  TYPE STANDARD TABLE,
      <result> TYPE STANDARD TABLE,
      <data>   TYPE data,
      <struct> TYPE any,
      <field>  TYPE any.
    DATA lr_struct TYPE REF TO cl_abap_structdescr.
    DATA lt_comps_wa   TYPE abap_compdescr_tab.

    "通過/UI2/CL_JSON=>generate() 來通過JSON來轉化出內表

    lr_data = /ui2/cl_json=>generate( json = json_result ).
    ASSIGN lr_data->* TO <data>.
    ASSIGN COMPONENT 'CODE' OF STRUCTURE <data> TO FIELD-SYMBOL(<code_ref>).

    ASSIGN <code_ref>->* TO FIELD-SYMBOL(<code>).

    IF <code> NE 200."調用api消息失敗,
      "輸出消息
      CLEAR wa_message.
      wa_message-type = 'E'.
      wa_message-id = 'ZJXZHU'.
      wa_message-number = 003.
      wa_message-message_v1 = <code>.
      ASSIGN COMPONENT 'MSG' OF STRUCTURE <data> TO FIELD-SYMBOL(<msg_ref>).
      ASSIGN <msg_ref>->* TO FIELD-SYMBOL(<msg>).
      wa_message-message_v2 = <msg>.
      CALL METHOD server->api_message_create
        EXPORTING
          message = wa_message.
      RETURN.
    ENDIF.


*轉化 , code = 200 表示接收成功
    ASSIGN COMPONENT 'NEWSLIST' OF STRUCTURE <data> TO FIELD-SYMBOL(<list>).
    IF sy-subrc EQ 0.
      lr_data = <list>.
      ASSIGN lr_data->* TO <table>.
      READ TABLE <table> INTO lr_data INDEX 1.
      IF sy-subrc EQ 0.
        LOOP AT <table> ASSIGNING FIELD-SYMBOL(<table_line>).
          ASSIGN <table_line>->* TO <data>.
          APPEND INITIAL LINE TO gt_data ASSIGNING FIELD-SYMBOL(<fs_data>).
          "獲取typeof
          lr_struct ?= cl_abap_typedescr=>describe_by_data( <data> ).
          lt_comps_wa = lr_struct->components.
          LOOP AT lt_comps_wa INTO DATA(ls_comps_wa).
            ASSIGN COMPONENT ls_comps_wa-name OF STRUCTURE <fs_data> TO <field>.
            IF sy-subrc EQ 0.
              ASSIGN COMPONENT ls_comps_wa-name OF STRUCTURE <data> TO FIELD-SYMBOL(<value_ref>).
              IF sy-subrc EQ 0.
                ASSIGN <value_ref>->* TO FIELD-SYMBOL(<value>).
                IF sy-subrc EQ 0.
                  <field> = <value>.
                ENDIF.
              ENDIF.
            ENDIF.
          ENDLOOP.
        ENDLOOP.
      ENDIF.
    ENDIF.

  ENDMETHOD.

在調用這個類執行中可以發現:LR_DATA->CODE->* = 200

LR_DATA->MSG->* = success

blob.png

blob.png

對於NEWSLIST每一行都是一個結構對象

blob.png

雙擊進入,可以看到獲取了美國新冠疫情的最新數據,每一行都是一個國家

blob.png

按照上面的結構,我們可以創建全局變量GT_DATA

DATA:
      BEGIN OF gs_data,
        confirmedcount        TYPE i, "確診人數
        confirmedcountrank    TYPE i, "確診人數排名
        continents            TYPE string, "大洲
        countryshortcode      TYPE string, "國家代碼
        curedcount            TYPE i, "治愈人數
        currentconfirmedcount TYPE i, "當前確診人數
        deadcount             TYPE i, "死亡人數
        deadcountrank         TYPE i, "死亡人數排名
        deadrate              TYPE string, "死亡率
        deadraterank          TYPE i, "死亡率排名
        locationid            TYPE i, "地址位置
        modifytime            TYPE i, "更新時間
        provincename          TYPE string, "國家名稱
      END OF gs_data .
    DATA:
      gt_data LIKE TABLE OF gs_data .

將獲取到的數據顯示在手機/平板端:

blob.png

可以點擊右上方的圖標,獲取累計確診排名前20名的國家柱狀圖:

可以看到我們查詢的時候,米國的確診人數已經到達了

blob.png

就是做了一個簡單的數據table 和 chart來學習一下

如上內容抄至:https://www.cnblogs.com/jxzhu/p/12616260.html

 

如下內容是自己擼的版本,參照了進行動態創建內表:https://www.cnblogs.com/seven1314pp/p/15093624.html

FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
               <dyn_wa> TYPE ANY,
               <dyn_field>.
DATA: dy_table TYPE REF TO data,
      dy_line  TYPE REF TO data,
      it_structure TYPE lvc_t_fcat,
      wa_structure TYPE lvc_s_fcat.
DATA gt_fieldcat TYPE slis_t_fieldcat_alv.
DATA ls_fieldcat LIKE LINE OF gt_fieldcat.

DATA:http_client TYPE REF TO if_http_client,
     url         TYPE string.
DATA lr_data TYPE REF TO data.
FIELD-SYMBOLS <data>   TYPE data.
FIELD-SYMBOLS <l_strut>   TYPE data.
DATA lr_struct TYPE REF TO cl_abap_structdescr.
DATA lt_comps_wa   TYPE abap_compdescr_tab.

START-OF-SELECTION.
  PERFORM get_data.
  PERFORM create_structure.        "定義內表的結構
  PERFORM create_dynamic_table.    "按照定義的內表結構,產生一個內表
  PERFORM write_data_to_dyntable.  "向動態內表中寫數
  PERFORM show_alv_data.           "顯示數據

*&---------------------------------------------------------------------*
*&      Form  get_data
*&---------------------------------------------------------------------*
FORM get_data.
  url = 'http://api.k780.com/?app=weather.today&weaId=2&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json'.   "網上找的免費API獲取北京天氣預報
   "創建http客戶端
  CALL METHOD cl_http_client=>create_by_url
    EXPORTING
      url                = url
    IMPORTING
      client             = http_client
    EXCEPTIONS
      argument_not_found = 1
      plugin_not_active  = 2
      internal_error     = 3
      OTHERS             = 4.
  "定傳輸請求內容格式以及編碼格式
  http_client->request->set_content_type( content_type = 'application/json; charset=utf-8' ).
*  定調用服務
  http_client->request->set_method( if_http_request=>co_request_method_get ).
  "發送
  CALL METHOD http_client->send
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3
      http_invalid_timeout       = 4
      OTHERS                     = 5.
  "接收
  CALL METHOD http_client->receive
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3.
  "回去返回的狀態
  DATA:http_status_code TYPE i,
       status_text      TYPE string.
  CALL METHOD http_client->response->get_status
    IMPORTING
      code   = http_status_code
      reason = status_text
       .
  "READ RESPONSE DATA  返回結果報文
  DATA:w_result TYPE string.
  CALL METHOD http_client->response->get_cdata
    RECEIVING data = w_result.

  "通過/UI2/CL_JSON=>generate() 來通過JSON來轉化出內表
  lr_data = /ui2/cl_json=>generate( json = w_result ).
  "進行圖1的轉換  才能實現如下ASSIGN COMPONENT的操作   並且雙擊結果也不一樣如圖2,圖3
  ASSIGN lr_data->* TO <data>.
  IF sy-subrc = 0.
    ASSIGN COMPONENT 'SUCCESS' OF STRUCTURE <data> TO FIELD-SYMBOL(<success_ref>).
    ASSIGN <success_ref>->* TO FIELD-SYMBOL(<success>).
    ASSIGN COMPONENT 'RESULT' OF STRUCTURE <data> TO FIELD-SYMBOL(<list>).
    IF sy-subrc EQ 0.
*      ASSIGN <list>->* TO FIELD-SYMBOL(<l_strut>).
      ASSIGN <list>->* TO <l_strut>.
      lr_struct ?= cl_abap_typedescr=>describe_by_data( <l_strut> ).  "結構轉化
      lt_comps_wa = lr_struct->components.
      LOOP AT lt_comps_wa INTO DATA(ls_comps_wa).     "循環獲取對應數據
        ASSIGN COMPONENT ls_comps_wa-name OF STRUCTURE <l_strut> TO FIELD-SYMBOL(<value_ref>).
        ASSIGN <value_ref>->* TO FIELD-SYMBOL(<value>).
      ENDLOOP.
    ENDIF.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  create_structure
*&---------------------------------------------------------------------*
FORM create_structure .
  LOOP AT lt_comps_wa INTO DATA(wa_comps).
    CLEAR wa_structure.
    wa_structure-fieldname = wa_comps-name.        "列名
    wa_structure-inttype   = 'C'.                  "數據類型
    wa_structure-intlen    = '30'.                 "長度
    wa_structure-reptext   = wa_comps-name.        "標題文本

    APPEND wa_structure TO it_structure.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  create_dynamic_table
*&---------------------------------------------------------------------*
FORM create_dynamic_table .
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = it_structure
    IMPORTING
      ep_table        = dy_table.
  ASSIGN dy_table->* TO <dyn_table>.    " 用表類型指針 <dyn_table> 指向 數據對象的內容.
ENDFORM.                    " create_dynamic_table
*&---------------------------------------------------------------------*
*&      Form  write_data_to_dyntable
*&---------------------------------------------------------------------*
FORM write_data_to_dyntable .
  CREATE DATA dy_line LIKE LINE OF <dyn_table>.  " 建立一個與動態內表結構相同的數據對象,且數據對象為是一個結構
  ASSIGN dy_line->* TO <dyn_wa>.                 " 用<dyn_wa>指針指向該結構
**動態字段賦值
  DEFINE m_add_value.
    ASSIGN COMPONENT &1 OF STRUCTURE <dyn_wa> TO <dyn_field>.
    <dyn_field> = &2.
    UNASSIGN <dyn_field>.
  END-OF-DEFINITION.
  LOOP AT lt_comps_wa INTO DATA(ls_comps_wa).
     ASSIGN COMPONENT ls_comps_wa-name OF STRUCTURE <l_strut> TO FIELD-SYMBOL(<value_ref>).
     ASSIGN <value_ref>->* TO FIELD-SYMBOL(<value>).
     m_add_value ls_comps_wa-name <value>.
  ENDLOOP.

  APPEND <dyn_wa> TO <dyn_table>.
ENDFORM.                    " write_data_to_dyntable
*&---------------------------------------------------------------------*
*&      Form  show_alv_data
*&---------------------------------------------------------------------*
FORM show_alv_data.
  LOOP AT it_structure INTO wa_structure..
    ls_fieldcat-fieldname = wa_structure-fieldname.
    ls_fieldcat-seltext_m = wa_structure-reptext.
    APPEND ls_fieldcat to gt_fieldcat.
    CLEAR ls_fieldcat.
  ENDLOOP.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      it_fieldcat = gt_fieldcat
    TABLES
      t_outtab    = <dyn_table>
    EXCEPTIONS
      program_error = 1
      OTHERS = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.

 

圖1

圖2

圖3

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM