SAP CPI-通过集成流转发原始图像数据

2020-08-20 10:11发布

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

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


专家们,

在一个用例中,我正在调用CPI​​终结点,并传入托管的jpeg图像的URL(例如这样: http://braiden.net/images/img.jpg ),然后我使用请求-回复向该URL发出GET请求,以将原始图像数据放入消息正文中。/p>

我已经成功地构建了这部分。 现在,我在消息正文中有了此原始图像数据,我想对SAP Optical Character Recognition服务进行请求-答复(此处记录)。

此API要求请求的格式如下:

•内容类型:多部分/表单数据; boundary = CPI

•APIKey:[some-valid-api-key]

•内容长度:[内容长度]

  • 必须包含一个多部分的表单主体,并且其中一个名为"文件"的字段包含图像数据

由于对此API的要求,我添加了一个内容修饰符,以删除所有不必要的标头(可能是从第一个请求中引入的标头)并添加了必需的标头。 (似乎CPI已自动添加" Content-Length"标头,并且任何更改/删除此标头的尝试均无效。)

在此内容修饰符内,我还在主体中添加了以下内容作为表达式:

-CPI
 内容处置:表单数据;  name ="文件";  filename =" img.jpg"
 内容类型:图片/jpeg

 $ {body}
 --CPI-

这将原始图像数据包装有multipart/form-data内容类型所需的必要边界信息。 (这种包装原始数据的方法是从此博客文章。)

这是我iflow的照片:

点击此处,将其下载为 一个zip文件。

我注意到的一件事是,从Postman发送请求与从CPI发送请求时,Content-Length标头的值完全不同,而且正如我已经提到的,似乎没有办法 手动将此标头设置为其他值。

我还注意到,在查看CPI发出的原始HTTP请求时,图像数据与使用REST客户端发送图像数据时的图像数据略有不同。 CPI发出的请求中经常缺少一些字符。

这是请求的两个示例,一个是从REST客户端发送的,另一个是从CPI发送的。 REST客户端的请求在发送到OCR API时有效,但CPI的请求无效(返回500错误)。

REST客户端请求

CPI请求

同样,差异是Content-Length标头值和CPI请求中的一些丢失字符。

以下是一些问题:

1。 使用请求答复获取原始图像数据是将图像存储在消息正文中的正确方法,还是有更好的方法?

2。 如何正确地将此图像发送到OCR API? 到目前为止,我仅从OCR API服务器收到500个错误。

3。 我应该使用MIME Multipart编码器还是脚本来修改编码? 如果可以,怎么办?

TL; DR:我想使用CPI将图像发送到光学字符识别API。 关于我可能做错了什么以及为什么我的请求不起作用的任何想法?

任何帮助将不胜感激!

(16.9 kB)

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

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


专家们,

在一个用例中,我正在调用CPI​​终结点,并传入托管的jpeg图像的URL(例如这样: http://braiden.net/images/img.jpg ),然后我使用请求-回复向该URL发出GET请求,以将原始图像数据放入消息正文中。/p>

我已经成功地构建了这部分。 现在,我在消息正文中有了此原始图像数据,我想对SAP Optical Character Recognition服务进行请求-答复(此处记录)。

此API要求请求的格式如下:

•内容类型:多部分/表单数据; boundary = CPI

•APIKey:[some-valid-api-key]

•内容长度:[内容长度]

  • 必须包含一个多部分的表单主体,并且其中一个名为"文件"的字段包含图像数据

由于对此API的要求,我添加了一个内容修饰符,以删除所有不必要的标头(可能是从第一个请求中引入的标头)并添加了必需的标头。 (似乎CPI已自动添加" Content-Length"标头,并且任何更改/删除此标头的尝试均无效。)

在此内容修饰符内,我还在主体中添加了以下内容作为表达式:

-CPI
 内容处置:表单数据;  name ="文件";  filename =" img.jpg"
 内容类型:图片/jpeg

 $ {body}
 --CPI-

这将原始图像数据包装有multipart/form-data内容类型所需的必要边界信息。 (这种包装原始数据的方法是从此博客文章。)

这是我iflow的照片:

点击此处,将其下载为 一个zip文件。

我注意到的一件事是,从Postman发送请求与从CPI发送请求时,Content-Length标头的值完全不同,而且正如我已经提到的,似乎没有办法 手动将此标头设置为其他值。

我还注意到,在查看CPI发出的原始HTTP请求时,图像数据与使用REST客户端发送图像数据时的图像数据略有不同。 CPI发出的请求中经常缺少一些字符。

这是请求的两个示例,一个是从REST客户端发送的,另一个是从CPI发送的。 REST客户端的请求在发送到OCR API时有效,但CPI的请求无效(返回500错误)。

REST客户端请求

CPI请求

同样,差异是Content-Length标头值和CPI请求中的一些丢失字符。

以下是一些问题:

1。 使用请求答复获取原始图像数据是将图像存储在消息正文中的正确方法,还是有更好的方法?

2。 如何正确地将此图像发送到OCR API? 到目前为止,我仅从OCR API服务器收到500个错误。

3。 我应该使用MIME Multipart编码器还是脚本来修改编码? 如果可以,怎么办?

TL; DR:我想使用CPI将图像发送到光学字符识别API。 关于我可能做错了什么以及为什么我的请求不起作用的任何想法?

任何帮助将不胜感激!

(16.9 kB)
付费偷看设置
发送
4条回答
clasier
1楼 · 2020-08-20 10:26.采纳回答

您好Braiden

您有一个非常有趣的场景:)

我没有一个直接的答案,但是我想根据对您提供的内容的分析提出建议。

我比较了您提供的文件,并在十六进制编辑器(例如HxD)中查找了字符差异。 来自REST客户端的请求具有其他字符EF BF BD,被视为 Unicode 替换字符(U + FFFD)。 我不确定为什么REST客户端有这个,而CPI没有。

我会中断 (如果还没有这样做的话),以确保从URL检索图像的第一部分工作正常。 请求答复后,尝试将其路由到SFTP服务器以保存图像文件。 然后从SFTP下载文件,然后尝试查看文件以查看是否有损坏。 还要与字节级别的原始文件(通过浏览器下载)进行比较。

关于内容长度,我不确定是否有替代方法。 我会尝试进一步研究,并让您知道是否找到了一些东西。

致谢

英瑞(Eng Swee)

SAP浪
2楼-- · 2020-08-20 10:14

您好,Braiden Psiuk

在Groovy中,双引号的使用允许字符串中的内插表达式。 这允许使用更紧凑的代码(与Java相比)来编写包含动态填充变量(即上述情况下的边界)的字符串。 这种用双引号引起来的字符串在Groovy中称为 GStrings -确实是这样命名的! :)

既然现在已经回答了该线程,您是否也可以关闭该线程?

最后,一旦建立并运行了端到端方案,将 如果您可以写一篇有关它的博客文章,那就太好了。 这是一个非常有趣的用例,它真正展示了CPI中的集成能力,并且对于将来正在研究此类方案的其他人也将是一个很好的参考材料。

注意

Eng Swee

空代码
3楼-- · 2020-08-20 10:22

感谢 Eng Swee Yeoh 提供的脚本。 我被困在这一部分已经有一段时间了,由于处理API请求的多部分/表单主体的问题,我过去几个月无法完成POC。

干杯!

Chandan

太Q了
4楼-- · 2020-08-20 10:13

嗨,Eng Swee Yeoh,我使用的是脚本,但出现415错误。

错误是

"状态":415,"错误":"不支持的媒体类型","消息":"无效的哑剧类型\" multipart/form-data; boundary = ---- = _ Part_12_1515749279.1587462416702 \":令牌\" ----

中无效的令牌字符'='

在将其添加为标头的一部分时,是否有一种转义=的方法?

一周热门 更多>