2016-07-28 47 views
3

我正在一個ASP.Net MVC 4 Web應用程序,我需要將JSON對象發佈到第三方API。現在我需要將我的JSON數據編碼,如API文檔中提到的那樣,將內容類型設置爲application/x-www-form-urlencoded。所以我嘗試通過指定Content-Typewc.Headers["Content-Type"] = "application/x-www-form-urlencoded";如下: -無法編碼我的JSON對象insdie我的WebClient UploadString使用頭[[Content-Type]] =「application/x-www-form-urlencoded」

var data = JsonConvert.SerializeObject(mainresourceinfo); 
using (WebClient wc = new WebClient()) 
{ 
    string url = currentURL + "resources?AUTHTOKEN=" + pmtoken; 
    Uri uri = new Uri(url); 

    // wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; 
    wc.Headers["Content-Type"] = "application/x-www-form-urlencoded"; 

    crudoutput = wc.UploadString(uri, "INPUT_DATA=" + data); 
} 

,但仍是數據沒有被編碼..如果我發送一個值,如123%456我的JSON字符串內,它將被保存爲123E6t在第三部分系統中。現在作爲解決方法,我已經手動編碼JSON對象使用WebUtility.UrlEncode(data)之前發送到第三部分API,我可以看到,值如123%456將被正確保存... 但我不想手動編碼數據,,我想設置內容類型來指定編碼...這可能嗎?

+0

我看你要張貼JSON數據,不應該是'的contentType = 「應用/ JSON」'? – Turbot

+0

@Turbot,但我想編碼我的json對象內的值???這可能嗎 ? –

+0

您是否嘗試設置您的請求'Content-Type = application/json'來查看它是否有效? – Turbot

回答

2

試試這個:

   using (var client = new WebClient()) 
      { 
       string url = "URL"; 
       client.Headers[HttpRequestHeader.ContentType] = "application/json"; 
       client.Encoding = System.Text.Encoding.UTF8; 
       string serialisedData = JsonConvert.SerializeObject(data); 
       string response = client.UploadString(url, serialisedData); 
      } 
+0

感謝您的回覆,但是我可以知道您的方法和我的方法之間有什麼區別嗎? –

4

使用

wc.Headers["Content-Type"] = "application/json" 

並嘗試設置的字符集

wc.Encoding = Encoding.UTF8; 
crudoutput = wc.UploadString(uri, "INPUT_DATA=" + Encoding.UTF8.GetString(data)); 

Charset被指定文件的字符編碼。默認字符集HTTP 1.1是ANSI,因爲ANSI與ISO-8859-1相同。
alse WebClient.Encoding默認設置爲Encoding.Default這意味着你得到ANSI代碼頁。所有默認編碼都會丟失數據,因此,您可以使用UTF-8。

所以,如果你設置字符集並不意味着所有的內容都必須被編碼爲Unicode,但這確實意味着這些文檔只能包含Unicode定義的字符。這意味着您還需要將您的內容保存爲UTF-8。在這種情況下,您可以使用Encoding.UTF8.GetString()

+0

你能請指教什麼是設置Content-Type和指定編碼(wc.Encoding = Encoding.UTF8;)之間的區別?是否足夠指定編碼?或者我需要使用他們兩個?以及爲什麼你使用Encoding.UTF8.GetString()也,我認爲wc.Encoding = Encoding.UTF8;將編碼數據不需要Encoding.UTF8.GetString()??這是正確的? –

+0

@johnG請參閱我的更新。並且請嘗試'application/x-www-form-urlencoded'。只是想知道結果。 [一些](https://www.w3.org/International/questions/qa-html-encoding-declarations)信息,可以幫助 – Marusyk

+0

,但我不明白你爲什麼使用兩次UTF8編碼?一個在「Encoding.UTF8.GetString(data)」裏面,另一個在「wc.Encoding = Encoding.UTF8;」裏面。這可能導致重複UTF8編碼? –

2

您可以使用WebClient.UploadValues(Uri, NameValueCollection)方法。它會自動爲你做所有的東西。您甚至不需要指定Content-Type標頭,因爲它默認發送Content-Type: application/x-www-form-urlencoded

下面是一個例子:

var data = JsonConvert.SerializeObject(mainresourceinfo); 
using (WebClient wc = new WebClient()) 
{ 
    string url = currentURL + "resources?AUTHTOKEN=" + pmtoken; 
    Uri uri = new Uri(url); 

    var body = new NameValueCollection 
    { 
     { "INPUT_DATA", data } 
    }; 
    crudoutput = wc.UploadValues(uri, body); 
} 
1

最近我有同樣的問題與第三方API。我花了一段時間才找到解決方案,而這裏已經給出的所有其他答案看起來很像我嘗試過並且沒有用的東西。 對我來說有效的是UploadDataAsync。在我的情況下,特殊字符(é,ü,ãetc)在將json字符串發送到API時會導致錯誤。

using (WebClient client = new WebClient()) 
{ 
    client.Headers.Add(HttpRequestHeader.ContentType, "application/json"); 
    client.Headers.Add(HttpRequestHeader.Accept, "application/json"); 
    client.UploadDataAsync(new Uri(apiUrl), "POST", Encoding.UTF8.GetBytes(jsonString)); 
} 
1

這我怎麼impliment我的帖子方法

public static string Post(Exchange exchValues, string url) 
{ 
    WebClient wc = new WebClient(); 
    wc.Encoding = Encoding.UTF8; 
    wc.Headers[HttpRequestHeader.ContentType] = "application/json"; 
    return wc.UploadString(url, "POST", Json.Stringify(exchValues)); 
} 

此發送123%,456和數據不轉換爲123%456,我是用ASP.net的Web API,JSON。使用Stringify。網Json序列化

另外我面臨同樣的問題,當我嘗試使用GET方法的密碼參數包含%字符和Api保持解碼,所以123 45美元解碼到123E6 所以我只是將%替換爲%25,它的工作

HttpUtility.UrlDecode("123%456".Replace("%","%25")); // =>123%45 

這裏是一些鏈接幫助我MSDNASCII Encoding Reference