通过CPI和HTTP适配器将zip文件和表单数据发送到Ariba

2020-08-15 00:06发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)大家好, 我在CPI中遇到有关...

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

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


大家好,

我在CPI中遇到有关HTTP适配器的问题。 该方案是在SFTP服务器中拾取文件,创建带有zip文件的表单数据,然后通过HTTP适配器将其发送到Ariba。

问题是我一直遇到错误状态代码411:要求内容长度。

我尝试手动定义此标头,但没有成功。 将消息发送到另一台主机会确认在CPI发送消息时会自动创建此标头,因此对我来说一定是另一件事。

在浏览博客时,我发现了另一篇有关此问题的文章。 链接在下面:

https://blogs.sap.com/2019/11/14/what-is-form-data-and-how-to-send-it-from-sap-cloud -platform-integration-cpi/

Nick Yang提出了一种解决方案,该解决方案围绕直接在脚本中打开到目标的连接而放弃了使用HTTP适配器的必要性。 但是我试图复制它,但是不断出现错误:

java.lang.NoSuchMethodException:方法的无签名:sun.net.www.http.PosterOutputStream.write()适用于参数类型:(org.apache.camel.converter.stream.InputStreamCache)值:[org .apache.camel.converter.stream.InputStreamCache @ 144c18fd]可能的解决方案:write([B),write(int),write(int),write(int),wait(),wait(long)

我认为这是因为我之前在另一个脚本中创建了表单数据,但之后没有将消息主体转换为字节数组。

有人可以帮我吗?

这是我当前的脚本:

 def消息postZipContentToAriba(消息){
     def messageLog = messageLogFactory.getMessageLog(message)
     def propertiesMap = message.getProperties()
     def headersMap = message.getHeaders()
    //开机自检
     def post = new URL(" Ariba-Network-URL")。openConnection();
     def zipContent = message.getBody()
    
     post.setRequestMethod(" POST")
     post.setDoOutput(true)
     post.setRequestProperty(" Content-Type",headersMap.get(" Content-Type")as String)
     post.getOutputStream()。write(zipContent);
    
     def postRC = post.getResponseCode();
     if(postRC.equals(200)){
         messageLog.addAttachmentAsString("发布结果:",作为字符串的post.getInputStream()。getText(),"文本/纯文本")
     }其他{
         def exceptionMsg =" HTTP" + postRC.toString()+"," + post.getInputStream()。getText()
         抛出新的异常(exceptionMsg作为字符串)
     }
    
     返回讯息
 }


 消息processData(消息){


     返回postZipContentToAriba(消息)
 }
 

在此之前使用的脚本是创建多部分的表单数据:

消息processData(消息消息){
    
    //将多部分设置为主体
     ByteArrayOutputStream outputStream =新的ByteArrayOutputStream()
    
     尝试{
    
         byte []个字节= message.getBody(byte [])
        //构造多部分
         MimeBodyPart bodyPartHead1 =新的MimeBodyPart()
         bodyPartHead1.setText('true')
         bodyPartHead1.setDisposition('form-data; name =" fullload"')
        
         MimeBodyPart bodyPartHead2 =新的MimeBodyPart()
         bodyPartHead2.setText('导入外部系统主数据')
         bodyPartHead2.setDisposition('form-data; name =" event"')
        
         MimeBodyPart bodyPartHead3 =新的MimeBodyPart()
         bodyPartHead3.setText(秘密)
         bodyPartHead3.setDisposition('form-data; name =" sharedsecret"')
        
         MimeBodyPart bodyPartHead4 =新的MimeBodyPart()
         bodyPartHead4.setText(systemId)
         bodyPartHead4.setDisposition('form-data; name =" systemId"')
        
         MimeBodyPart bodyPartHead5 =新的MimeBodyPart()
         bodyPartHead5.setText('加载并删除')
         bodyPartHead5.setDisposition('form-data; name =" Operation"')
        
         MimeBodyPart bodyPartHead6 =新的MimeBodyPart()
         bodyPartHead6.setText('Cloud')
         bodyPartHead6.setDisposition('form-data; name =" clienttype"')
        
         MimeBodyPart bodyPartHead7 =新的MimeBodyPart()
         bodyPartHead7.setText('CPI')
         bodyPartHead7.setDisposition('form-data; name =" clientinfo"')
        
         MimeBodyPart bodyPartHead8 =新的MimeBodyPart()
         bodyPartHead8.setText('1.0.0')
         bodyPartHead8.setDisposition('form-data; name =" clientversion"')
        
        
         MimeBodyPart bodyPart =新的MimeBodyPart()
         ByteArrayDataSource dataSource =新的ByteArrayDataSource(bytes,'application/zip')
         DataHandler byteDataHandler =新的DataHandler(dataSource)
         bodyPart.setDataHandler(byteDataHandler)
         bodyPart.setFileName('content.zip')
         bodyPart.setDisposition('form-data; name =" content"')
    
         MimeMultipart multipart =新的MimeMultipart()
         multipart.addBodyPart(bodyPartHead1)
         multipart.addBodyPart(bodyPartHead2)
         multipart.addBodyPart(bodyPartHead3)
         multipart.addBodyPart(bodyPartHead4)
         multipart.addBodyPart(bodyPartHead5)
         multipart.addBodyPart(bodyPartHead6)
         multipart.addBodyPart(bodyPartHead7)
         multipart.addBodyPart(bodyPartHead8)
         multipart.addBodyPart(bodyPart)
        
         multipart.updateHeaders()
        
         multipart.writeTo(outputStream)
         message.setBody(outputStream)
    
        //用边界设置内容类型
         字符串边界=(new ContentType(multipart.contentType))。getParameter('boundary');
         message.setHeader('Content-Type'," multipart/form-data; boundary = \" $ {boundary} \""")
        
        //计算邮件大小
        //message.setHeader('content-length',message.getBodySize())
    
     } catch(Exception e){
        
     }最后{
         outputStream.close()
     }


     返回讯息
 }
 

谢谢您的问候

JoãoGomes

11条回答
95年老男孩
2020-08-15 00:35

Hello Nick,

感谢您的投入。 我定期使用Postman,但之前从未遇到过HTTP错误代码411。 HTTP适配器错误很麻烦。

实际上,现在我遇到了另一个问题。 客户需要从CPI到Ariba的基于证书的身份验证。 因此,我需要更改postZipContentToAriba函数以在密钥库中使用CPI证书来建立连接,但是我被卡在其中。.

一周热门 更多>