2017-02-21 64 views
0

我对REST的整个想法非常非常新,从一般情况下调用了一个来自http的API,但对于我正在开发的项目来说,它已经变得非常必要。在.NET中通过HttpClient传递参数时不清楚核心

我使用的是ASP.NET Core,所以我一直在试图找到一个REST库。当我使用标准.NET时,我可以使用RestSharp,但社区制作的RestSharp.Core已过时,并且与较新版本的.NET Standard 1.6+存在许多不兼容问题。

为此,我已经探索了其他的选择,但是我的经验不足只会令人沮丧。不可避免的是,我认为如果我只是使用内置的HttpClient课程是最好的。但我不确定如何为这种确切的情况做到这一点。我很难理解如何给请求提供参数,以及我在返回值中特别注意的内容。

我的需求很简单;

  1. 创建指定它是一个POST操作$url
  2. 的连接。
  3. 在发出请求时将现有的JSON对象传递给服务器。
  4. 得到JSON数据返回。

我的代码,使用旧的RestSharp.Core,看起来有点像这样 - 显然是隐私的关键和这样的。

public async Task<string> OpenApiAsync() { 
    var token = await Task.Run(async() => { 
     var httpClient = new RestClient("https://[OMITTED].auth0.com/oauth/token"); 
     var httpRequest = new RestRequest() { 
      Serializer = new RestSharp.Serializers.JsonSerializer(), 
      Method = Method.POST 
     }; 

     httpRequest.AddHeader("content-type", "application/json"); 
     httpRequest.AddJsonBody(new { 
      client_id = _settings.Value.ClientId, 
      client_secret = _settings.Value.ClientSecret, 
      audience = _settings.Value.Audience, 
      grant_type = _settings.Value.GrantType 
     }); 

     var httpResponse = await httpClient.Execute(httpRequest); 
     var deserializer = new RestSharp.Deserializers.JsonDeserializer(); 
     return deserializer.Deserialize<Dictionary<string, string>>(httpResponse); 
    }); 

    return token["access_token"]); 
} 

_settings对象被注入IOptions<Auth0Settings>,其具有这样的形状和一般的数据。

"authentication": { 
    "Domain": "[auth0-domain]", 
    "Audience": "https://[OMITTED].auth0.com/api/v2/", 
    "ClientId": "ABCDEFGHIJKLMNOP....", 
    "ClientSecret": "A22u5hgbnwifhwihfwi20u559f...", 
    "CallbackUrl": "http://localhost:5000/signin-auth0", 
    "GrantType": "client_credentials" 
} 

谁能帮助我了解如何可以被移植到原生HttpClient是在.NET Standard 1.6+?我特别需要一个与netstandard1.6netcoreapp1.1兼容的驱动程序。

回答

0

HttpClient是一个非常好的HTTP客户端,应在.NET核心推进:)

private static async Task<string> OpenApiAsync() 
    { 
     var client = new HttpClient(); 
     client.DefaultRequestHeaders.Add("content-type", "application/json"); 
     var body = JsonConvert.SerializeObject(YOUR_BODY); 
     var result = await client.PostAsync("https://[OMITTED].auth0.com/oauth/token", new StringContent(body , Encoding.UTF8)); 
     var deserialized = JsonConvert.DeserializeObject<Dictionary<string, string>>(await result.Content.ReadAsStringAsync()); 
     return deserialized["access_token"]; 
    } 
+0

非常感谢您使用。这清除了很多,它让我放弃了一个相当沉重和不稳定的包的依赖! – Ciel

+0

@Ciel关于'''HttpClient''的一件好事就是它是线程安全的。所以通常最好的做法是每个远程服务器使用一个'''HttpClient''' – 2017-02-22 04:49:15