Problem Posting a MIME-encoded application to the Ariba vendor network

I had a problem trying to use VB.NET and a WebRequest object to publish some cXML text and attachments. I believe that I am formatting the text of the data that I want to publish correctly, as it matches the samples provided by Ariba. I'm not sure if I use the WebRequest object correctly for publishing. I set the method to "POST" and ContentType to "multipart / mixed". I can successfully publish cXML (using ContentType "text / xml"), so I know the publication in general works. The message I get from Ariba is "The document cannot be parsed: Missing start border [ANCLS-741552]", however, as the following code shows, there is a start border. I deleted some proprietary data and replaced it with "...".After the MIME text, I included the corresponding VB.NET code that I am using.

Any suggestions are welcome and appreciated!

------=_boundary.20100210154837663.173702
Content-Type: text/xml; charset=UTF-8
Content-ID: Part1.5213.20100210154837663.319349

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.018/cXML.dtd">
<cXML.../cXML>

------=_boundary.20100210154837663.173702
Content-Type: application/octet-stream
Content-transfer-encoding: base64
Content-ID: 5213.20100210154837663.319349
Content-Disposition: attachment; filename=attachment_20100210154837663_125705.jpg
Content-Length: 5660

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAkGBwgHBgkIBwgKCgkLDRYPDQwMDRsUFRAWIB0iIiAd
.
.
.
dC2Nz9dOaQ1ZVIilwIpaWvLEg7aWuauv/9k=
------=_boundary.20100210154837663.173702--


Dim myWriter As StreamWriter = Nothing

Dim strUri As String = "https://service.ariba.com/service/transaction/cxml.asp"

Dim WebReq As WebRequest = System.Net.WebRequest.Create(strUri)

WebReq.Method = "POST"
WebReq.ContentType = "multipart/mixed"

myWriter = New StreamWriter(WebReq.GetRequestStream())
myWriter.Write(xmlText)
myWriter.Close()

Dim WebRsp As HttpWebResponse
WebRsp = CType(WebReq.GetResponse(), HttpWebResponse)
+3
source share
3 answers

Bill - I received some information from Ariba and thought it might be useful for you:

  • Content-type declaration for the entire payload indicates the boundary
  • Each part is preceded by w / a '-', followed by a border
  • The document ends with a '-' followed by a border, followed by a '-'
  • The content identifier of each part is enclosed in angle brackets.
  • Attachment Content Id refers to URL element in comments / attachments without angle brackets

Perhaps you could try with a short boundary line. Also pay attention to the "start" parameter. Here is the one that worked for me:

request.ContentType =  "multipart/related;boundary=outerboundary1;type=""text/xml"";start=""<x.xml>"""

XML :

--outerboundary1

Content-Type: text/xml

Content-ID: <x.xml>

<?xml version="1.0"?>

<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.007/InvoiceDetail.dtd">

<cXML payloadID="za1saasxsx" timestamp="2003-04-04" xml:lang="en"><Header><From> 

... 

<Comments>These also use bluetooth<Attachment><URL>cid:xx@cxml.org</URL></Attachment></Comments>

...

</Request></cXML>

--outerboundary1

Content-type: text/plain; charset=US-ASCII

Content-Disposition: attachment; filename=PremiereCatalog.xxx

Content-Length: 4

Content-ID: <xx@cxml.org>

xxxx

--outerboundary1-- 

, . lemme , , .

Pravin

+1

, . :

from:
      request.ContentType = "text/xml; charset=utf-8"
to
      request.ContentType = "multipart/related;boundary=outerboundary1;type=""text/xml"";start=""<x.xml>"""
+1

XML MIME Ariba SN. POSTing XML MIME .

msg, : : . ( 1, 1) [ANCLS-741552]

XML, :

------=_Part_19_14056801.1265738936575
Content-Type: text/xml; charset=UTF-8
Content-Disposition: attachment; filename=TestMessage020910.xml
Content-ID:

?<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE cXML SYSTEM "http://xml.cXML.org/schemas/cXML/1.2.021/InvoiceDetail.dtd">
<cXML>...</cXML>

------=_Part_19_14056801.1265738936575
Content-Type: image/tiff
Content-transfer-encoding: binary
Content-ID: TestImageURL
Content-Disposition: attachment; filename=TestImageURL.tif
Content-Length: 23618

II*? [??&?lDr#??292??292?`?????pr9?3]?2s7???L?@7?r9?A?a?A??h4?B?d;? r1?
.
.
????[?????????(???????1?7????[??2????.\??@????????????????%?? ????%?? ?Pixel Translations Inc., PIXTIFF Version 57.0.218.2183??2007:12:11 09:55:11?
------=_Part_19_14056801.1265738936575--
????????????????????????????????????????????????????????????????????????????????????????????
.
.
????????????????????????????????????????????????????????????????????????????????????????????

VB.Net:

Private Function Post_XML(ByVal XmlFile As String) As String
  If XmlFile.Length = 0 Then
   MsgBox("Error: XML File cannot be blank", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "Error")
   Return ""
  End If

  If File.Exists(XmlFile) = False Then
   MsgBox("Error: File does not exist - " + XmlFile, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "Error")
   Return ""
  End If

  Dim ASN_Link As String = "https://service.ariba.com/service/transaction/cxml.aspx"
  rtbLog.Text = ""
  System.Threading.Thread.Sleep(1000)

  rtbLog.Text = rtbLog.Text & vbCrLf & "To " & ASN_Link & vbCrLf

  Dim sr As StreamReader = New StreamReader(XmlFile)
  Dim XMLRead As String = sr.ReadToEnd
  Dim stXML As String
  stXML = XMLRead
  sr.Close()

  Try
   Dim results As String

   Dim request As WebRequest = WebRequest.Create(ASN_Link)
   request.Method = "POST"
   request.ContentType = "text/xml; charset=utf-8"

   Dim proxyObject As WebProxy = New WebProxy("proxy.xyz.com:8080", True)
   proxyObject.Credentials = CredentialCache.DefaultCredentials
   request.Proxy = proxyObject
   request.PreAuthenticate = True
   results = WriteToURL(request, stXML)

   Dim Response As String
   Response = RetrieveFromURL(request)
   rtbLog.Text = rtbLog.Text & vbCrLf & Response

   Return "OK"

  Catch ex As Exception
   MessageBox.Show(ex.Message, "", MessageBoxButtons.OK)
   Return "Error"
   Exit Function
  End Try

 End Function

  Private Function WriteToURL(ByVal Request As WebRequest, ByVal data As String) As String

    Try
   'Dim bytes = System.Text.Encoding.ASCII.GetBytes(data)
   Dim bytes = System.Text.Encoding.UTF8.GetBytes(data)
      Request.ContentLength = bytes.Length

      Dim OutPutStream As Stream = Request.GetRequestStream
      OutPutStream.Write(bytes, 0, bytes.length)
   OutPutStream.Close()
   Return "Ok"
    Catch ex As Exception
   MessageBox.Show(ex.Message & " - Write To URL", "error", MessageBoxButtons.OK)
   Return "Error"
      Exit Function
    End Try

  End Function

  Private Function RetrieveFromURL(ByVal Request As WebRequest) As String

    Try
      Dim response As WebResponse = Request.GetResponse
      Dim stream As Stream = response.GetResponseStream
      Dim sr As StreamReader = New StreamReader(stream)
      Return sr.ReadToEnd
    Catch ex As Exception
   MessageBox.Show(ex.Message & " - Retrieve From URL", "", MessageBoxButtons.OK)
   Return "Error"
      Exit Function
    End Try

  End Function
0

Source: https://habr.com/ru/post/1732259/


All Articles