簡體   English   中英

如何使用WebRequest.Create發布對象?

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

當您的對象具有大量屬性和/或包含需要轉義的數據時,這將比自己構建字符串容易得多。


使用JSON傳遞對象

API文檔缺少任何演示對象傳遞的示例。 似乎我們不得不猜測。 噓!

我在網上討論過,對於RESTful服務而言,使用稱為json字符串 (JavaScript Object Notation)的格式傳遞復雜數據結構似乎是非常典型和標准的,如下所示:

“地址”:{“line1”:“這是地址的第1行”,“城市”:“西雅圖”,“州”:“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"

等等

試一試。 第三次是魅力?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM