【发布时间】:2017-09-20 09:18:11
【问题描述】:
我在通过 VB.NET 控制台应用程序向 BambooHR API 提交多部分表单时遇到了很多困难。我已经发布了我当前的代码以及下面文档中的示例请求,当我运行此代码时,我得到 (400) Bad Request。我知道代码很乱,但我一直在努力让它工作。
我能够使用他们的示例代码使 GET 请求工作,但他们没有任何代码来执行此特定 API 调用(上传员工文件)。
任何帮助将不胜感激。
这是我的代码:
Sub Main()
upload(id, "https://api.bamboohr.com/api/gateway.php/company")
Console.WriteLine()
Console.WriteLine("Press ENTER to quit")
Console.ReadLine()
End Sub
Function upload(ByVal employeeId As Integer, ByVal baseUrl As String)
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 Or SecurityProtocolType.Ssl3
Dim boundary = "----BambooHR-MultiPart-Mime-Boundary----"
Dim url = String.Format("{0}/v1/employees/{1}/files/", baseUrl, employeeId)
Dim request As HttpWebRequest = WebRequest.Create(url)
request.KeepAlive = True
request.Method = "POST"
request.ContentType = "multipart/form-data; boundary=" + boundary
'Authorization is just the api key and a random string, in this case is x
'
Dim authInfo As String = api_key + ":" + "x"
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo))
request.Headers("Authorization") = "Basic " + authInfo
Dim memStream As New MemoryStream()
WriteMPF(memStream)
request.ContentLength = memStream.Length
Using requestStream = request.GetRequestStream()
memStream.Position = 0
Dim tempBuffer As Byte() = New Byte(memStream.Length - 1) {}
memStream.Read(tempBuffer, 0, tempBuffer.Length)
memStream.Close()
requestStream.Write(tempBuffer, 0, tempBuffer.Length)
End Using
Dim webresponse As HttpWebResponse = request.GetResponse()
Return webresponse
End Function
Private Sub WriteMPF(s As Stream)
WriteToStream(s, "POST /api/gateway.php/company/v1/employees/id/files/ HTTP/1.0")
WriteToStream(s, vbCr & vbLf)
WriteToStream(s, "Host: api.bamboohr.com")
WriteToStream(s, vbCr & vbLf)
WriteToStream(s, "Content-Type: multipart/form-data; boundary=----BambooHR-MultiPart-Mime-Boundary----")
WriteToStream(s, vbCr & vbLf)
WriteToStream(s, "Content-Length: 520")
WriteToStream(s, vbCr & vbLf)
WriteToStream(s, vbCr & vbLf)
WriteToStream(s, "------BambooHR-MultiPart-Mime-Boundary----")
WriteToStream(s, vbCr & vbLf)
WriteToStream(s, "Content-Disposition: form-data; name=""category""")
WriteToStream(s, vbCr & vbLf)
WriteToStream(s, vbCr & vbLf)
WriteToStream(s, "14")
WriteToStream(s, vbCr & vbLf)
WriteToStream(s, "------BambooHR-MultiPart-Mime-Boundary----")
WriteToStream(s, vbCr & vbLf)
WriteToStream(s, "Content-Disposition: form-data; name=""fileName""")
WriteToStream(s, vbCr & vbLf)
WriteToStream(s, vbCr & vbLf)
WriteToStream(s, "test.txt")
WriteToStream(s, vbCr & vbLf)
WriteToStream(s, "------BambooHR-MultiPart-Mime-Boundary----")
WriteToStream(s, vbCr & vbLf)
WriteToStream(s, "Content-Disposition: form-data; name=""share""")
WriteToStream(s, vbCr & vbLf)
WriteToStream(s, vbCr & vbLf)
WriteToStream(s, "no")
WriteToStream(s, vbCr & vbLf)
WriteToStream(s, "------BambooHR-MultiPart-Mime-Boundary----")
WriteToStream(s, vbCr & vbLf)
WriteToStream(s, "Content-Disposition: form-data; name=""file""; filename = ""test.txt""")
WriteToStream(s, vbCr & vbLf)
WriteToStream(s, "Content-Type: text/plain")
WriteToStream(s, vbCr & vbLf)
WriteToStream(s, vbCr & vbLf)
WriteToStream(s, "this is a test!")
WriteToStream(s, vbCr & vbLf)
WriteToStream(s, vbCr & vbLf)
WriteToStream(s, "------BambooHR-MultiPart-Mime-Boundary------")
WriteToStream(s, vbCr & vbLf)
End Sub
Private Sub WriteToStream(s As Stream, txt As String)
Dim bytes As Byte() = Encoding.UTF8.GetBytes(txt)
s.Write(bytes, 0, bytes.Length)
End Sub
这是来自文档的示例请求:(链接:https://www.bamboohr.com/api/documentation/employees.php 向下滚动到“上传员工文件”)
POST /api/gateway.php/sample/v1/employees/1/files/HTTP/1.0 主办方:api.bamboohr.com 内容类型:multipart/form-data;边界=----BambooHR-MultiPart-Mime-Boundary---- 内容长度:520
-----BambooHR-MultiPart-Mime-Boundary---- 内容处置:表单数据;名称="类别"
112 ------BambooHR-MultiPart-Mime-Boundary---- 内容处置:表单数据; name="文件名"
自述文件.txt ------BambooHR-MultiPart-Mime-Boundary---- 内容处置:表单数据;名称="分享"
是的 ------BambooHR-MultiPart-Mime-Boundary---- 内容处置:表单数据;名称=“文件”;文件名="readme.txt" 内容类型:text/plain
这是一个示例文本文件。
-----BambooHR-MultiPart-Mime-Boundary-----
【问题讨论】:
-
(400) 他们的文档中没有提到错误请求。也许你应该联系他们并询问这意味着什么。
-
这里确实这么说:bamboohr.com/api/documentation
-
你不应该自己做 multipart/form-data (RFC 1867) 的构造,有很多事情需要处理。现在使用 .NET 4.5 应该很容易。检查这个:stackoverflow.com/questions/16416601/…
标签: vb.net post .net-4.5 multipartform-data