今天是個娛樂的節日,學點新東西,如下:
突發奇想想要使用abap去獲取個網站上公布的api,然后顯示一下
就當最近學習NEPTUNE的小練習吧
百度一下獲取疫情的網站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
對於NEWSLIST每一行都是一個結構對象
雙擊進入,可以看到獲取了美國新冠疫情的最新數據,每一行都是一個國家
按照上面的結構,我們可以創建全局變量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 .
將獲取到的數據顯示在手機/平板端:
可以點擊右上方的圖標,獲取累計確診排名前20名的國家柱狀圖:
可以看到我們查詢的時候,米國的確診人數已經到達了
就是做了一個簡單的數據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