尝试使用ABAP代码从Webservice Rest获取数据时出错。

2020-08-20 10:57发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我有下一个问题:

1) 我有一个适用于Chrome的下一个网址:(今天是8月1日有效)

https://junjitest。 mineduc.cl/api-doc-parv/v1/docente/35605/rut/17878912?apikey=SpfBRV2HHyxAyaWcorai777RubbFGpYg

,结果可以在附件" fig1.jpg ";

2)的目的是使用ABAP代码,而我正在使用下一个代码,结果您可以在附件" 图2_R.jpg ";

 cl_http_client => create_by_url(导出
  url ='https://junjitest.mineduc.cl/api-doc-parv/v1/docente/35605/rut/17878912?apikey = SpfBRV2HHyxAyaWcorai777RubbFGpYg'IMPORTINGclient = lo_http_client
  例外情况
  arguments_not_found = 1
  plugin_not_active = 2
  internal_error = 3
  其他= 4。

 如果sy-subrc <> 0。 返回。 万一。
 *我更改了使用GET方法的逻辑:
 lo_http_client-> request-> set_method('GET')。
 lo_http_client-> request-> set_content_type('application/json')。
 *发送请求
 lo_http_client->发送(
 例外情况
 http_communication_failure = 1
 http_invalid_state = 2)。
 *收到回复
 lo_http_client-> receive(
 例外情况
  http_communication_failure = 1
  http_invalid_state = 2
  http_processing_failed = 3)。
 *检查响应。 希望您能返回JSON response.DATA lv_response TYPE字符串。
 lv_response = lo_http_client-> response-> get_cdata()。

我使用ABAP代码进行了其他测试,以管理 junjitest.mineduc.cl 取决于opc值变量(1或2)。 opc = 1到 junjitest.mineduc.cl 或opc = 2到时间和天气网站(它 使用有效期至2019年8月2日明天的APIKEY。

结果是:

a)附件 fig3-r.jpg junjitest.mineduc.cl ),与 Fig2_R.jpg

b)附件 fig4-wr.jpg ( 时间和天气网站)从哪里获得结果(我的意思是,ABAP代码有效!)

 REPORT Z_TEST_MINEDUC_REST。

 数据:客户端类型引用到if_http_client,
       路径TYPE字符串,
       方案类型TYPE i,
       关闭TYPE I,
       主机类型TYPE字符串,
       porttype TYPE字符串,
       contenttype TYPE字符串。


 数据ld_request类型参考if_http_request。
 数据:lv_host TYPE字符串。
 数据:OPC TYPE C长度01。

 opc ='1'。  " --- <简报中的junjitest.mineduc.cl
 案例OPC。
   当为" 1"时。  "" ---  request-> set_header_field(name ='〜request_method'value ='GET')。
 * client-> request-> set_header_field(name ='Content-Type'value ='application/x-www-form-urlencoded')。
 client-> request-> set_header_field(name ='Content-Type'value ='application/json; charset = UTF-8')。
 *发送和接收

 ld_request =客户端->请求。
 呼叫方法client-> request-> set_method(
   if_http_request => co_request_method_get)。

 客户端->发送()。
 客户端->接收()。

 DATA:内容类型字符串。
 数据:lt_itab TYPE TABLE OF字符串,
       ls_itab TYPE字符串。

   内容=客户端->响应-> get_cdata()。
   在cl_abap_char_utilities => newline INTO TABLE lt_itab中拆分内容。
 *在"#"到表lt_itab中分割内容。


   循环至lt_itab INTO ls_itab。
 *将ls_itab中所有出现的" <"替换为" <"。
 *将ls_itab中所有出现的'>'替换为'>'。
     写:/ls_itab。
 *写:/内容。
   结束。
   BREAK-POINT。
   client-> close()。
 

如果需要设置其他内容(证书等),您能否发表评论?

WS是REST,目标是从mineduc服务器获得结果。

我将不胜感激。

此致

何塞

fig1.jpg (136.0 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我有下一个问题:

1) 我有一个适用于Chrome的下一个网址:(今天是8月1日有效)

https://junjitest。 mineduc.cl/api-doc-parv/v1/docente/35605/rut/17878912?apikey=SpfBRV2HHyxAyaWcorai777RubbFGpYg

,结果可以在附件" fig1.jpg ";

2)的目的是使用ABAP代码,而我正在使用下一个代码,结果您可以在附件" 图2_R.jpg ";

 cl_http_client => create_by_url(导出
  url ='https://junjitest.mineduc.cl/api-doc-parv/v1/docente/35605/rut/17878912?apikey = SpfBRV2HHyxAyaWcorai777RubbFGpYg'IMPORTINGclient = lo_http_client
  例外情况
  arguments_not_found = 1
  plugin_not_active = 2
  internal_error = 3
  其他= 4。

 如果sy-subrc <> 0。 返回。 万一。
 *我更改了使用GET方法的逻辑:
 lo_http_client-> request-> set_method('GET')。
 lo_http_client-> request-> set_content_type('application/json')。
 *发送请求
 lo_http_client->发送(
 例外情况
 http_communication_failure = 1
 http_invalid_state = 2)。
 *收到回复
 lo_http_client-> receive(
 例外情况
  http_communication_failure = 1
  http_invalid_state = 2
  http_processing_failed = 3)。
 *检查响应。 希望您能返回JSON response.DATA lv_response TYPE字符串。
 lv_response = lo_http_client-> response-> get_cdata()。

我使用ABAP代码进行了其他测试,以管理 junjitest.mineduc.cl 取决于opc值变量(1或2)。 opc = 1到 junjitest.mineduc.cl 或opc = 2到时间和天气网站(它 使用有效期至2019年8月2日明天的APIKEY。

结果是:

a)附件 fig3-r.jpg junjitest.mineduc.cl ),与 Fig2_R.jpg

b)附件 fig4-wr.jpg ( 时间和天气网站)从哪里获得结果(我的意思是,ABAP代码有效!)

 REPORT Z_TEST_MINEDUC_REST。

 数据:客户端类型引用到if_http_client,
       路径TYPE字符串,
       方案类型TYPE i,
       关闭TYPE I,
       主机类型TYPE字符串,
       porttype TYPE字符串,
       contenttype TYPE字符串。


 数据ld_request类型参考if_http_request。
 数据:lv_host TYPE字符串。
 数据:OPC TYPE C长度01。

 opc ='1'。  " --- <简报中的junjitest.mineduc.cl
 案例OPC。
   当为" 1"时。  "" ---  request-> set_header_field(name ='〜request_method'value ='GET')。
 * client-> request-> set_header_field(name ='Content-Type'value ='application/x-www-form-urlencoded')。
 client-> request-> set_header_field(name ='Content-Type'value ='application/json; charset = UTF-8')。
 *发送和接收

 ld_request =客户端->请求。
 呼叫方法client-> request-> set_method(
   if_http_request => co_request_method_get)。

 客户端->发送()。
 客户端->接收()。

 DATA:内容类型字符串。
 数据:lt_itab TYPE TABLE OF字符串,
       ls_itab TYPE字符串。

   内容=客户端->响应-> get_cdata()。
   在cl_abap_char_utilities => newline INTO TABLE lt_itab中拆分内容。
 *在"#"到表lt_itab中分割内容。


   循环至lt_itab INTO ls_itab。
 *将ls_itab中所有出现的" <"替换为" <"。
 *将ls_itab中所有出现的'>'替换为'>'。
     写:/ls_itab。
 *写:/内容。
   结束。
   BREAK-POINT。
   client-> close()。
 

如果需要设置其他内容(证书等),您能否发表评论?

WS是REST,目标是从mineduc服务器获得结果。

我将不胜感激。

此致

何塞

fig1.jpg (136.0 kB)
付费偷看设置
发送
12条回答
wang628962
1楼-- · 2020-08-20 11:24

我认为我遇到了您的问题,它与代理设置有关(我也有代理,并且没有在SAP中进行设置,我的状态也为404)。 请阅读 wiki 以获取SICF的更多详细信息。/p>

太Q了
2楼-- · 2020-08-20 11:20

您好,我在浏览器中尝试了第一个URL junjitest.mineduc.cl (Chrome),而且响应时间非常长。 我最终得到了响应JSON,但是花了大约1分钟。 您的回复时间也长吗? 可能是问题所在...

落灬小鱼
3楼-- · 2020-08-20 11:31

您好何塞·海梅斯

我在邮递员中尝试过,它毫无问题地获得了JSOn数据。 我还在SAP中创建了一个简单程序,它也能毫无问题地获取JSON数据(我必须在STRUST中设置证书)。

这是有效的代码。 请注意,我跳过了异常和错误处理(您不应在最终代码中使用)!

 DATA:l_api_url TYPE字符串,
       lo_http类型参考if_http_client,
       l_CODE TYPE i,
       l_reason TYPE字符串,
       l_response_json TYPE字符串。
 * -------------------------------------------------  ------------------- *

 " HTTP客户端

 l_api_url =
   'https://junjitest.mineduc.cl/api-doc-parv/v1/docente/35605/rut/17878912?apikey=SpfBRV2HHyxAyaWcorai777RubbFGpYg'。

 尝试。
     cl_http_client => create_by_url(
       出口
         网址= l_api_url
         ssl_id ='ANONYM'
       输入
         客户端= lo_http
       例外情况
         arguments_not_found = 1
         plugin_not_active = 2
         internal_error = 3
         其他= 4)。
   捕获cx_root INTO DATA(lo_root)。
 ENDTRY。

 lo_http-> request-> set_method('GET')。

 lo_http-> send(
   例外情况
     http_communication_failure = 1
     http_invalid_state = 2
     http_processing_failed = 3
     http_invalid_timeout = 4
     其他= 5)。

 lo_http-> receive(
   例外情况
     http_communication_failure = 1
     http_invalid_state = 2
     http_processing_failed = 3
     其他= 4)。

 lo_http->响应-> get_status(
   输入
     代码= l_code
     原因= l_reason)。

 l_response_json = lo_http-> response-> get_cdata()。

 lo_http-> close(
   例外情况
     http_invalid_state = 1
     OTHERS = 2)。
Alawn_Xu
4楼-- · 2020-08-20 11:28

请不要仅将重要信息作为图像提供。

图像在其他情况下很有用,但在仅包含文本的情况下则无用。 如果必须使用图像,最好直接显示它们,而无需使用超链接。

因此,在第2点和第3点,您将收到以下错误消息(fig2-r.jpg和fig3-r.jpg ):

 404找不到
 在此服务器上找不到请求的URL/api-doc-parv/v1/docente/35605/rut/17878912
 位于163.247.44.99端口80的Apache/2.2.15(CentOS)服务器

对于其他2张图片,我让您这样做(只需编辑您的问题,无需添加评论)。

微wx笑
5楼-- · 2020-08-20 11:34

您好 Tomas Buryanek

是的。 答案时间很长!

感谢您的时间,但我认为它与REPORT Z中使用的HTTPS和ABAP CL_HTTP_CLIENT类更为复杂。

樱桃小丸子0093
6楼-- · 2020-08-20 11:22

我可以看到,这可能与 HTTPS服务(您发送URL的第一个代码,但发送IP并将其设置为HTTP的第二个代码),请检查以下线程:

https://stackoverflow.com/questions/44065710/ https-request-via-if-http-client

或者可能是您可以尝试将该IP添加到主机文件...

一周热门 更多>