簡體   English   中英

需要幫助將我的RestSharp代碼轉換為使用HttpClient

[英]Need help converting my RestSharp code to use HttpClient instead

由於我需要將此C#dll轉換為要從Visual Basic 6調用的tlp文件,因此我需要避免使用外部依賴項。 我使用RestSharp通過執行以下操作來使用WebAPI:

using RestSharp;
using Newtonsoft.Json;

..

public string GetToken (string Key, string Password) {

  var client = new RestClient (BaseUrl + "auth/GetToken");
  var request = new RestRequest (Method.POST);
  request.AddHeader ("cache-control", "no-cache");
  request.AddHeader ("Content-Type", "application/json");
  Dictionary<string, string> data = new Dictionary<string, string> {
    { "APIKey", Key },
    { "APIPassword", Password }
};
var dataJSON = JsonConvert.SerializeObject (data);
request.AddParameter ("undefined", dataJSON, ParameterType.RequestBody);

IRestResponse response = client.Execute (request);

GetTokenResults g = JsonConvert.DeserializeObject<GetTokenResults> (response.Content); 

return g.Token;
}

其中,GetTokenResults是一個結構,其中包含字符串Token的聲明。 我想在不使用RestSharp的情況下實現相同的功能。 這是我失敗的嘗試:

using System.Net.Http;
using System.Net.Http.Headers;

..

public async void GetToken (string Key, string Password) {

  var client = new HttpClient ( );
  client.DefaultRequestHeaders.Accept.Clear ( );
  client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue ("application/json"));
  client.BaseAddress = new Uri (BaseUrl + "auth/GetToken");

  Dictionary<string, string> data = new Dictionary<string, string> {
  { "APIKey", Key },
  { "APIPassword", Password }
};
  var dataJSON = JsonConvert.SerializeObject (data);

  var content = new StringContent (dataJSON, Encoding.UTF8, "application/json");

  var response = await client.PostAsync ("", content);

}

我不清楚如何使用HttpClient達到與之前使用RestSharp相同的結果(發送API密鑰和密碼,以字符串形式返回令牌)。 任何能指出我正確方向的東西都將不勝感激!

我認為您在方法PostAsync中缺少第一個參數,即requestUri = Client.BaseAddress(請參閱下面的實現)。

請先嘗試一下,如果沒有用,請閱讀以下內容。 我有一個不同的實現,我將client.BaseAddress作為第一個參數傳遞,並將我的內容作為ByteArrayContent傳遞。 就我而言,我必須將我的內容作為我的代碼的“ application / x-www-form-urlencoded”摘錄傳遞:

        var buffer = Encoding.UTF8.GetBytes(content);
        var byteContent = new ByteArrayContent(buffer);
        //as I can't send JSON, probably, you can skip as it's already JSON
        byteContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/x-www-form-urlencoded");  
       //requestUri=client.BaseAddress          
        await client.PostAsync(requestUri, byteContent).ConfigureAwait(false); 

我們的需求有所不同,但我認為您非常接近。 如果沒有幫助,請寫信給我,我將分享我的代碼。 閱讀評論后,我想分享我如何制作HttpClient。 代碼是這樣的:

 using (var client = CreateMailClientForPOST($"{BaseUrl}/"))
        {
           //removed code, you can call above code as method like
           var response= await client.DoThingAsAsync($"{client.BaseAddress}, content").ConfigureAwait(false);
        }

protected HttpClient CreateMailClientForPOST(string resource)
    {
        var handler = new HttpClientHandler();
        if (handler.SupportsAutomaticDecompression)
        {
            handler.AutomaticDecompression = System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.Deflate;
        }

        var client = new HttpClient(handler)
        {

            BaseAddress = new Uri($"https://api.address.com/rest/{resource}")
        };
        return client;
    }

我認為您對此問題感到ung惱。 簡而言之, client.BaseAddress的URI在其client.BaseAddress需要一個斜杠。

但是,我不會簡單地添加它,我會考慮做一些不同的事情。 假設您要向其附加"auth/GetToken" ,則您的BaseUrl可能已經有一個斜杠。 我會這樣:

client.BaseAddress = new Uri(BaseUrl);
...
var response = await client.PostAsync("auth/GetToken", content);

如您所見, HttpClient非常適合您的代碼設置方式,即您有一個帶有尾部斜杠的“基本”地址,並且您想為特定的調用附加到該地址。

這應該使您擺脫困境。 您需要解決的下一件事是反序列化JSON響應,以便您可以從中獲取令牌。 除了在response.Content不是HttpClient世界中的字符串之外,它與在RestSharp中的操作類似。因此您還需要執行以下步驟:

var json = await response.Content.ReadAsStringAsync();
GetTokenResults g = JsonConvert.DeserializeObject<GetTokenResults>(json);
return g.Token;

您需要做的最后一件事就是將方法簽名更改為:

public async Task<string> GetTokenAsync

最后一點:您現在處於異步世界,這是一件好事,但是您需要知道如何正確使用它,否則可能會遇到死鎖和其他神秘的錯誤。 簡而言之, 不要在調用堆棧的任何地方調用.Result.Wait() 阻塞異步代碼 這是迄今為止人們最常見的錯誤。 使用async/await 一路下跌

暫無
暫無

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

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