Asp.net 如何使用WebRequest.Create发布对象?

Asp.net 如何使用WebRequest.Create发布对象?,asp.net,httpwebrequest,webrequest,Asp.net,Httpwebrequest,Webrequest,我正在使用平衡支付API,并试图找出如何创建客户 地址是作为对象传递的,尽管我不知道如何传递字符串以外的任何内容。以下是我迄今为止成功传递姓名和电子邮件地址的代码: Dim request As WebRequest = WebRequest.Create("https://api.balancedpayments.com/v1/customers") request.Method = "POST" ' get this information from settin

我正在使用平衡支付API,并试图找出如何创建客户

地址是作为对象传递的,尽管我不知道如何传递字符串以外的任何内容。以下是我迄今为止成功传递姓名和电子邮件地址的代码:

    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,并可用于呈现QueryString。请查看:

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服务来说,使用一种称为(JavaScript对象表示法)的格式传递复杂的数据结构似乎是非常典型和标准的,这种格式如下所示:

“地址”:{“第1行”:“这是地址的第1行”,“城市”:“西雅图”,“州”:“华盛顿”}

这里有更多的例子,但我建议从简单开始,以确保这是API想要的

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

如果成功了,我们可以看看更简单的方法来构建json。如果您使用的是.NET4.5,请检查。否则,您只需多做一点工作,并实现自己的功能,或者如中所述

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


使用Balanced Payments API有趣的语法传递对象 好的,我一直在翻看那个API文档,发现了一个

我从这个例子推断,传递“对象”的方法是提供对象名并在方括号中逐个包含其属性

所以你的情况应该是这样

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"
等等


试试看。第三次是魅力?

谢谢你的回复。在我最初的帖子中,我成功地传递了字符串值。我面临的问题是客户的“地址”对象。OP中的链接显示address对象由line1、城市、州、邮政编码等组成。啊,好的,很抱歉,我看到了问题。出于某种原因,我以为您是在尝试添加银行帐户,而不是添加客户。用新信息编辑了我的帖子。祝你好运我尝试按如下方式传递json,但它不起作用(我也尝试了单引号):Dim postData as String=“name=John Doe&email=jdoe@domain.com&“地址:{”“line1”“:”“123大街”“城市”“巴尔的摩”“州”“马里兰州”“邮政编码”“:”“21224”“}”您是否收到任何特定错误?此外,请尝试“address=”而不是“address:”name=value&address={name:value,name:value}没有错误,系统显示它已收到,但它不会将地址字段添加到新客户:{“name”:“John Doe”,“address\”:{“line1\”:“123 Main St\”,“city\:“Baltimore\,“state\”:“MD\,“posal\u code\”:“21224\”,“email”: "jdoe@domain.com" }
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"