[英]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.