我有一个问题。我正在Go中的客户端工作,它与SOAP服务器联系。我应该在主体中使用SOAP消息向服务器发送HTTP POST请求。我还必须在请求中附加一个文件。我该怎么做?
到目前为止,我能够将SOAP消息放入请求中,但不能获取如何在请求中包含该文件。下面是生成请求的代码。如何在此请求中包含该文件?
payload := strings.NewReader(soapDataString)
req, _ := http.NewRequest("POST", endPointUrl, payload)
req.SetBasicAuth("user", "password")
req.Header.Add("content-type", "text/xml")
req.Header.Add("cache-control", "no-cache")
req.Header.Add("SOAPAction", "")
return req
答案 0 :(得分:1)
您应该使用支持添加附件的SOAP库,或者您应该知道SOAP标准以包含附件。
来自https://www.w3.org/TR/SOAP-attachments
以下示例显示附加的SOAP 1.1消息 签名的索赔表的传真图像(claim061400a.tiff):
MIME-Version: 1.0 Content-Type: Multipart/Related; boundary=MIME_boundary; type=text/xml; start="<claim061400a.xml@claiming-it.com>" Content-Description: This is the optional message description. --MIME_boundary Content-Type: text/xml; charset=UTF-8 Content-Transfer-Encoding: 8bit Content-ID: <claim061400a.xml@claiming-it.com> <?xml version='1.0' ?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body> .. <theSignedForm href="cid:claim061400a.tiff@claiming-it.com"/> .. </SOAP-ENV:Body> </SOAP-ENV:Envelope> --MIME_boundary Content-Type: image/tiff Content-Transfer-Encoding: binary Content-ID: <claim061400a.tiff@claiming-it.com> ...binary TIFF image... --MIME_boundary--
它是一个多部分MIME类型。您可以使用mime/multipart包轻松生成多部分。
这是另一个片段,它创建一个包含文件系统中任意文件的多部分表单(来自this blog)。
file, err := os.Open(path)
if err != nil {
return nil, err
}
defer file.Close()
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, err := writer.CreateFormFile(paramName, filepath.Base(path))
if err != nil {
return nil, err
}
_, err = io.Copy(part, file)
err = writer.Close()
if err != nil {
return nil, err
}
req, err := http.NewRequest("POST", uri, body)
req.Header.Set("Content-Type", writer.FormDataContentType())
return req, err