[英]How do you post an object using WebRequest.Create?
我正在使用Balanced Payments API并试图找出如何创建客户。
https://docs.balancedpayments.com/current/api.html?language=bash#creating-a-customer
地址作为对象传递,但我不熟悉如何传递除字符串以外的任何内容。 这是我到目前为止成功传递名称和电子邮件地址的代码:
Dim request As WebRequest = WebRequest.Create("https://api.balancedpayments.com/v1/customers")
request.Method = "POST"
' get this information from settings in your web config.
Dim userName As String = "API KEY GOES HERE"
Dim credentials As String = Convert.ToString(userName & Convert.ToString(":"))
request.Headers("Authorization") = "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(credentials))
Dim postData As String = "name=John Doe&email=jdoe@domain.com"
Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData)
request.ContentType = "application/x-www-form-urlencoded"
request.ContentLength = byteArray.Length
Dim dataStream As Stream = request.GetRequestStream()
dataStream.Write(byteArray, 0, byteArray.Length)
dataStream.Close()
Dim response As WebResponse = request.GetResponse()
' create a data stream.
dataStream = response.GetResponseStream()
' create a stream reader.
Dim reader As New StreamReader(dataStream)
' read the content into a string
Dim serverResponse As String = reader.ReadToEnd()
' clean up.
reader.Close()
dataStream.Close()
response.Close()
我偷看了API文档,从它的外观来看,你实际上并没有在请求中传递一个对象。 您传递标记/值对字符串列表。
以下是API文档的摘录,其中显示了创建银行帐户的示例:
curl https://api.balancedpayments.com/v1/bank_accounts \
-u ak-test-oAm876JsVLRmHwrswIGZ1kaelufk8Cmy: \
-d "routing_number=121000358" \
-d "type=checking" \
-d "name=Johann Bernoulli" \
-d "account_number=9900000001"
为了理解这个例子,你需要curl的引用,在这里找到。
-u传递没有密码的用户ID“ak-test-oAm876JsVLRmHwrswIGZ1kaelufk8Cmy”。
-d表示HTTP POST正文中的标记/值对。 如您所见,有四行,每行代表一个银行帐户的属性。
因此,除非出现严重错误,否则以下代码应该这样做:
Dim postData As String = "routing_number=121000358&type=checking&name=Johann+Bernoulli&account_number=9900000001"
Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData)
request.ContentType = "application/x-www-form-urlencoded"
request.ContentLength = byteArray.Length
Dim dataStream As Stream = request.GetRequestStream()
dataStream.Write(byteArray, 0, byteArray.Length)
dataStream.Close()
如果这对您不起作用,请发布有关该问题的其他详细信息。
顺便提一下,有一个技巧可以将格式良好的标签值对列表组合在一起。 如果使用ParseQueryString静态方法创建NameValueCollection,则它在内部创建为HttpValueCollection,可用于呈现查询字符串。 看看这个:
Dim myCollection as NameValueCollection = HttpUtility.ParseQueryString(""); //Create empty collection
myCollection["routing_number"] = "121000358";
myCollection["type"] = "checking";
myCollection["name"] = "Johann Bernoulli";
myCollection["account_number"] = "99900000001";
Dim postData as String = myCollection.ToString(); //Magic!!
Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData)
当您的对象具有大量属性和/或包含需要转义的数据时,这将比自己构建字符串容易得多。
API文档缺少任何演示对象传递的示例。 似乎我们不得不猜测。 嘘!
我在网上讨论过,对于RESTful服务而言,使用称为json字符串 (JavaScript Object Notation)的格式传递复杂数据结构似乎是非常典型和标准的,如下所示:
“地址”:{“line1”:“这是地址的第1行”,“城市”:“西雅图”,“州”:“WA”}
这是一个更详细的例子,但我建议开始简单,以确保这是API想要的。
尝试按照这种模式对一个简单的json字符串进行硬编码,并将其传递给服务,看它是否有效。
如果它成功,我们可以看看构建json的更简单方法。 如果您使用的是.NET 4.5,请点击此处 。 否则你必须做更多的工作并实现你自己的功能, 如本文或本文所述 。
但第一个技巧是验证我的猜测。 这是一个非常好的猜测,因为Balanced Payments API在响应消息中使用了json(在示例中可以清楚地看到)。 尝试一下,让我知道你发现了什么。
好的,我一直在探索那个API文档,并找到了一个传递对象的好例子 。
curl https://api.balancedpayments.com/v1/marketplaces/TEST-MP5is34cQM5VCKcHcIfXxLGw/credits \
-u ak-test-oAm876JsVLRmHwrswIGZ1kaelufk8Cmy: \
-d "amount=10000" \
-d "bank_account[routing_number]=121000358" \
-d "bank_account[type]=checking" \
-d "bank_account[name]=Johann Bernoulli" \
-d "bank_account[account_number]=9900000001"
我从这个例子中推断,传递“对象”的方法是提供对象名称,并在方括号中逐个包含其属性。
所以在你的情况下它应该是
Dim postData as String = "name=John Doe&address[line1]=123 Main St&address[city]=Baltimore&address[state]=MD&address[postal_code]=21224&email=jdoe@domain.com"
等等
试一试。 第三次是魅力?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.