0

我正在使用 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()
4

1 回答 1

2

我查看了 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)

当您的对象有很多属性和/或包含需要转义的数据时,这将比自己构建字符串容易得多。


使用 JSON 传递对象

API 文档缺少任何演示对象传递的示例。看来我们不得不猜测了。嘘!

我在网上查了一下,RESTful 服务使用一种称为json 字符串(JavaScript 对象表示法)的格式来传递复杂的数据结构似乎非常典型和标准,看起来像这样:

"address" : { "line1" : "这是地址的第 1 行","city":"Seattle","state":"WA"}

这是一个更详细的示例,但我建议从简单开始,以确保这是 API 想要的。

尝试按照此模式硬编码一个简单的 json 字符串并将其传递给服务,以查看它是否有效。

如果它成功了,我们可以看看更简单的方法来构建 json。如果您使用的是 .NET 4.5,请查看此处。否则,您只需要多做一点工作并实现您自己的功能,如本文本文所述

但第一个技巧是验证我的猜测。这是一个很好的猜测,因为 Balanced Payments API 在响应消息中使用了 json(从示例中可以清楚地看到)。试试看,让我知道你发现了什么。


使用 Balanced Payments API 的有趣语法传递对象

好的,我一直在寻找那个 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"

等等

试试看。第三次是魅力?

于 2013-10-22T02:30:02.707 回答