ABAP CL_HTTP_CLIENT REST JSON问题

2020-09-05 05:34发布

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

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


我们需要从使用JSON的ABAP连接到外部HTTPS REST服务。


我们正在通过SAPGui(而不是Eclipse)使用直接ABAP,而且我们还没有使用7.4,因此我不能使用新的标准SAP JSON类。


我下载并安装了ZJSON内容,但是我很难找到清晰的示例来描述应如何使用它。


到目前为止,我正在调用CL_HTTP_CLIENT类CREATE_BY_DESTINATION方法来使用基本身份验证打开与外部服务的连接。 根据我们需要调用的特定函数,他们为我们提供了具有各种方法子路径的基本URL。


我的麻烦点一直在尝试在需要传递参数的地方调用它们的API方法,但是在使用ABAP CL_HTTP_CLIENT类的HTTP/REST/JSON语法上遇到了麻烦。

我正在调用CL_HTTP_CLIENT-> REQUEST-> SET_HEADER_FIELD来设置标头值:

'〜server_protocol'='HTTP/1.1'

'Accept'='application/json'

'Content-Type'='application/json; charset = utf-8'

我正在调用CL_HTTP_CLIENT-> REQUEST-> SET_METHOD将请求方法设置为" POST"

我还要调用CL_HTTP_UTILITY => SET_REQUEST_URI来设置完整的方法路径(在基本URL之后),包括我们需要使用的特定方法。

我尝试将所需的方法参数设置为表单字段,但我认为他们需要将其设置为JSON格式。

作为测试,我对他们的期望进行了硬编码,并称为CL_HTTP_CLIENT-> REQUEST-> SET_CDATA,但是他们的服务器返回了非常长的HTML页面,而不是用JSON语法包装的预期返回参数。

我在正确的轨道上吗? 是CL_HTTP_CLIENT-> REQUEST-> SET_CDATA(或SET_DATA)方法将指定的内容放入HTTP REST"有效负载"中还是应该做其他事情?

非常感谢您能提供的任何帮助。

布莱恩

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

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


我们需要从使用JSON的ABAP连接到外部HTTPS REST服务。


我们正在通过SAPGui(而不是Eclipse)使用直接ABAP,而且我们还没有使用7.4,因此我不能使用新的标准SAP JSON类。


我下载并安装了ZJSON内容,但是我很难找到清晰的示例来描述应如何使用它。


到目前为止,我正在调用CL_HTTP_CLIENT类CREATE_BY_DESTINATION方法来使用基本身份验证打开与外部服务的连接。 根据我们需要调用的特定函数,他们为我们提供了具有各种方法子路径的基本URL。


我的麻烦点一直在尝试在需要传递参数的地方调用它们的API方法,但是在使用ABAP CL_HTTP_CLIENT类的HTTP/REST/JSON语法上遇到了麻烦。

我正在调用CL_HTTP_CLIENT-> REQUEST-> SET_HEADER_FIELD来设置标头值:

'〜server_protocol'='HTTP/1.1'

'Accept'='application/json'

'Content-Type'='application/json; charset = utf-8'

我正在调用CL_HTTP_CLIENT-> REQUEST-> SET_METHOD将请求方法设置为" POST"

我还要调用CL_HTTP_UTILITY => SET_REQUEST_URI来设置完整的方法路径(在基本URL之后),包括我们需要使用的特定方法。

我尝试将所需的方法参数设置为表单字段,但我认为他们需要将其设置为JSON格式。

作为测试,我对他们的期望进行了硬编码,并称为CL_HTTP_CLIENT-> REQUEST-> SET_CDATA,但是他们的服务器返回了非常长的HTML页面,而不是用JSON语法包装的预期返回参数。

我在正确的轨道上吗? 是CL_HTTP_CLIENT-> REQUEST-> SET_CDATA(或SET_DATA)方法将指定的内容放入HTTP REST"有效负载"中还是应该做其他事情?

非常感谢您能提供的任何帮助。

布莱恩

付费偷看设置
发送
2条回答
能不能别闹
1楼 · 2020-09-05 06:00.采纳回答

布莱恩,

根据我的经验,如果您在尝试调用REST服务时收到一个较长的HTML字符串作为响应,则该字符串通常表示某种HTML错误页面。 下载完整的字符串并在类似记事本的工具中进行检查(甚至将其保存到.htm文件并使用浏览器打开)可能会有所帮助,以查看是否提供了更多有关错误原因的线索。

如果这不能帮助诊断问题,我可以提供一个使用CL_HTTP_CLIENT类的基本模板,该模板的灵感来自我编写的一些代码,这些代码将SAP实例与第三方工具链接在一起。 与您的方法相比,存在一些差异,但希望这会有所帮助,以帮助您找到所需的答案:

*使用此CREATE_BY_URL可以简化使用此类的某些方面

数据lo_http_client类型参考if_http_client。

cl_http_client => create_by_url(

导出

url =' https://rest.test.com/api/docs/doc_id'

导入

客户端= lo_http_client

例外情况

arguments_not_found = 1

plugin_not_active = 2

internal_error = 3

其他= 4)。

IF sy-subrc <> 0。

返回。

ENDIF。

*请记住要进行身份验证

lo_http_client-> authenticate(

用户名='我的用户名'

密码='我的密码'

)。

*在此处将您的有效负载硬编码以进行测试。

数据lv_payload TYPE字符串。

lv_payload ='{"添加":{"名称":"我的有效负载"}}''。

*将该有效负载转换为xstring。

数据lv_payload_x TYPE xstring。

通话功能'SCMS_STRING_TO_XSTRING'

导出

文字= uv_payload

导入

缓冲区= lv_payload_x。

*我的逻辑最初使用PUT,但是您应该可以更改为POST

lo_http_client-> request-> set_method('PUT')。

lo_http_client-> request-> set_content_type('application/json')。

lo_http_client-> request-> set_data(lv_payload_x)。

*发送请求

lo_http_client->发送(

例外情况

http_communication_failure = 1

http_invalid_state = 2)。

*收到回复

lo_http_client->接收(

例外情况

http_communication_failure = 1

http_invalid_state = 2

http_processing_failed = 3)。

*检查响应。 希望您能返回JSON响应。

数据lv_response TYPE字符串。

lv_response = lo_http_client-> response-> get_cdata()。

希望这会有所帮助。

谢谢

Brian

暮风yp
2楼-- · 2020-09-05 06:00

嗨,Brian,

感谢您对下一期的评论。
我有一个适用于Chrome的下一个网址: https://junjitest.mineduc.cl/api-doc-parv/v1/docente/35605/rut/17878912?apikey=SpfBRV2HHyxAyaWcorai777RubbFGpYg

我已经修改了您的代码,如您所见:

 cl_http_client => create_by_url(
  出口
  url ='https://junjitest.mineduc.cl/api-doc-parv/v1/docente/35605/rut/17878912?apikey=SpfBRV2HHyxAyaWcorai777RubbFGpYg'
  输入
  客户端= lo_http_client
  例外情况
  arguments_not_found = 1
  plugin_not_active = 2
  internal_error = 3
  其他= 4)。
如果sy-subrc <> 0。 返回。 ENDIF。
*我更改了使用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响应。 DATA lv_response TYPE字符串。
lv_response = lo_http_client-> response-> get_cdata()。

响应是:

<!DOCTYPE HTML PUBLIC"-//IETF//DTD HTML 2.0//EN"># # 404未找到# < 正文>#

未找到

#

在此服务器上找不到请求的URL/api-doc-parv/v1/docente/35605/rut/17878912。

#
#<地址> Apache/2.2.15


我将不胜感激。

此致

JoséJaimes

一周热门 更多>