我试图通过模仿docusign文档中列出的六种编程语言中的语法来在VBA中发布文档,但没有运气。我可以成功GET
登录信息,但使用此信息POST
文档证明是致命的:这是我收到的错误:
INVALID_MULTI_PART_REQUEST 解析multipart请求时发现错误。边界终止符' - 边界 - '在请求中找不到。
任何帮助将不胜感激。 这是我到目前为止的代码:
Private Sub APILoginCallTest()
' Step 1 - get initial login information
' defined request and result variables
Set httpRequest = New XMLHTTP60
Set httpResult = New DOMDocument60
' clear out login information response fields
With ThisWorkbook.Sheets("Dashboard")
.Range("rngResponseLoginStatus").Value = vbNullString
.Range("rngResponseLoginFull").Value = vbNullString
End With
'open login information url
httpRequest.Open "GET", "https://demo.docusign.net/restapi/v2/login_information", False
' set headers (listed below)
With ThisWorkbook.Sheets("Dashboard")
For h = 1 To 3
httpRequest.setRequestHeader .Range("rngAPIHeaderLI0" & CStr(h)).Offset(0, -1).Value, _
.Range("rngAPIHeaderLI0" & CStr(h)).Value
Next h
End With
' currently headers are defined as follows (there are three) filling in the method above :
' X-DocuSign-Authentication : <DocuSignCredentials>
' <Username>[username]</Username>
' <Password>[password]</Password>
' <IntegratorKey>[ikey]</IntegratorKey>
' </DocuSignCredentials>
' Accept : application/xml
' Content-Type : application/xml
' send login information request
httpRequest.send
' record response in Dashboard worksheet for later review
With ThisWorkbook.Sheets("Dashboard")
.Range("rngResponseLoginStatus").Value = httpRequest.Status & "-" & httpRequest.statusText
.Range("rngResponseLoginFull").Value = httpRequest.responseText
End With
' display response in immediate window
Debug.Print "Login Status and Text=" & httpRequest.Status, httpRequest.statusText
Debug.Print "Login Response=" & httpRequest.responseText
' Step 2 signature request
' clear out sig request responses
With ThisWorkbook.Sheets("Dashboard")
.Range("rngResponseSigRequestStatus").Value = vbNullString
.Range("rngResponseSigRequestFull").Value = vbNullString
End With
' define the new URL for the signature request using the Base URL returned aboved appended with '/envelopes'
Dim sigURL As String
sigURL = ThisWorkbook.Sheets("Dashboard").Range("rngResponseLoginBaseUrl").Value & "/envelopes"
' currently sig URL is 'https://demo.docusign.net/restapi/v2/accounts/[account number]'
Dim sigBody As String
' start the body of the request
sigBody = "<envelopeDefinition xmlns=\" & Chr(34) & "http://www.docusign.com/restapi\" & Chr(34) & ">"
' add email info to the body
sigBody = sigBody & "<emailSubject>API Call for adding signature request to document and sending</emailSubject>" & _
"<status>sent</status>"
' add documents to the body
sigBody = sigBody & "<documents>" & _
"<document>" & _
"<documentId>1</documentId>" & _
"<name>" & ThisWorkbook.Sheets("Dashboard").Range("rngDocumentName").Value & "</name>" & _
"</document>" & _
"</documents>"
' add email recipients
sigBody = sigBody & "<recipients>" & _
"<signers>" & _
"<signer>" & _
"<recipientId>1</recipientId>" & _
"<name>" & ThisWorkbook.Sheets("Dashboard").Range("rngRecipientName").Value & "</name>" & _
"<email>" & ThisWorkbook.Sheets("Dashboard").Range("rngRecipientEmail").Value & "</email>" & _
"<tabs>" & _
"<signHereTabs>" & _
"<signHere>" & _
"<xPosition>100</xPosition>" & _
"<yPosition>100</yPosition>" & _
"<documentId>1</documentId>" & _
"<pageNumber>1</pageNumber>" & _
"</signHere>" & _
"</signHereTabs>" & _
"</tabs>" & _
"</signer>" & _
"</signers>" & _
"</recipients>"
' close the envelope definition
sigBody = sigBody & "</envelopeDefinition>"
' read in document in byte array
Dim intFileNum%, bytTemp As Byte, intCellRow%
Dim bytTempAll As String
intFileNum = FreeFile
intCellRow = 0
Open (ThisWorkbook.Path & "\" & ThisWorkbook.Sheets("Dashboard").Range("rngDocumentName").Value) For Binary Access Read As intFileNum
Do While Not EOF(intFileNum)
' intCellRow = intCellRow + 1
Get intFileNum, , bytTemp
'Cells(intCellRow, 1) = bytTemp
bytTempAll = bytTempAll & bytTemp
Loop
Close intFileNum
Dim lenFile As Long
lenFile = Len(bytTempAll) ' just curious
Set AdobeStream = CreateObject("ADODB.STREAM")
With AdobeStream
.Type = 1 ' binary
.Open ' open the file
.LoadFromFile (ThisWorkbook.Path & "\" & ThisWorkbook.Sheets("Dashboard").Range("rngDocumentName").Value)
End With
' create multipart/form-data request into a 'Pre' and a 'Post' with the document bytes eventually going in between
Dim requestBodyPre As String
requestBodyPre = "\r\n\r\n--BOUNDARY\r\n" & _
"Content-Type: multipart/form-data, boundary =BOUNDARY" & vbCrLf & _
"Content-Length: " & lenFile & "\r\n" & _
sigBody & _
"\r\n\r\n--BOUNDARY\r\n" & _
"Content-Type: " & ThisWorkbook.Sheets("Dashboard").Range("rngContentType").Value & "\r\n" & _
"Content-Disposition: file; filename:\" & Chr(34) & ThisWorkbook.Sheets("Dashboard").Range("rngDocumentName").Value & Chr(34) & "\; " & _
"documentid=1\r\n\r\n"
' break up the requestBody into 'Pre' and 'Post' because document bytes need to be passed in the middle
Dim requestBodyPost As String
requestBodyPost = "\r\n" & "--BOUNDARY--\r\n\r\n"
' reset response variables for use in signature response
Set httpRequest = Nothing
Set httpResult = Nothing
Set httpRequest = New XMLHTTP60
Set httpResult = New DOMDocument60
' open url for signature POST
Debug.Print "POST to url " & sigURL
httpRequest.Open "POST", sigURL, False
' attach headers
For h = 1 To 3
httpRequest.setRequestHeader ThisWorkbook.Sheets("Dashboard").Range("rngAPIHeaderSR0" & CStr(h)).Offset(0, -1).Value, _
ThisWorkbook.Sheets("Dashboard").Range("rngAPIHeaderSR0" & CStr(h)).Value
Next h
' currently headers are defined as follows (there are three) filling in the method above :
' X-DocuSign-Authentication : <DocuSignCredentials>
' <Username>[username]</Username>
' <Password>[password]</Password>
' <IntegratorKey>[ikey]</IntegratorKey>
' </DocuSignCredentials>
' Accept : application/xml
' Content-Type multipart/form-data; boundary=BOUNDARY
' send request
Dim streamAll As String
'streamAll = StrConv(requestBodyPre, vbUnicode) & StrConv(requestBodyPost, vbUnicode)
'streamAll = AdobeStream.readtext
'
Debug.Print "sending " & requestBodyPre
Debug.Print "sending " & requestBodyPost
' post request
httpRequest.send requestBodyPre & AdobeStream.read & requestBodyPost
' record sig request response in worksheet
With ThisWorkbook.Sheets("Dashboard")
.Range("rngResponseSigRequestStatus").Value = httpRequest.Status & "-" & httpRequest.statusText
.Range("rngResponseSigRequestFull").Value = httpRequest.responseText
End With
Set httpRequest = Nothing
Set httpResult = Nothing
Set AdobeStream = Nothing
MsgBox "Done!"
End Sub
答案 0 :(得分:1)
更多的是问题/评论,但这看起来不对:
sigBody = "<envelopeDefinition xmlns=\" & Chr(34) & _
"http://www.docusign.com/restapi\" & Chr(34) & ">"
您不能使用"
在VBA中转义\
,而是将它们加倍:
sigBody = "<envelopeDefinition xmlns=""http://www.docusign.com/restapi"">"
答案 1 :(得分:0)
您是否已将requestBodyPre & AdobeStream.read & requestBodyPost
分配给字符串变量以检查该值是否符合预期?甚至可以将它写入文本文件。
您还应该检查换行符序列是否正确(可能只是\r
或\n
)
答案 2 :(得分:0)
我用更多代码解决了这个问题,但发现了我在其他部分发布的问题。 决议不是使用adobestream而是将其作为字节读取。