如何使用System.Net.Http将access_token和id_token发送到api?当我用邮递员测试我的api时,似乎发送了两个令牌并返回了我需要的个人用户信息(用户销售的产品列表)。我不确定如何在我的Xamarin应用程序中执行此操作,并且已经坚持了很长一段时间。我能够发送如下所示的access_token,但是在发送两个令牌时我尝试过的任何内容都返回了404找不到的内容。 (未经授权更正为401,因此access_token仍然有效)
public async Task<string> GetResponseJsonString(string url)
{
string responseJsonString = null;
var access_token = CrossSecureStorage.Current.GetValue("access_token");
using (var httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Clear();
httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + access_token);
HttpResponseMessage response = httpClient.GetAsync(url).Result;
responseJsonString = await response.Content.ReadAsStringAsync();
}
return responseJsonString;
}
注意: 我知道id_token应包含用户信息,应该对其进行解码,而不是发送用户信息请求。我看了这个,并且无法找到适用于xamarin PCL的库。我看着JosePCL.Jwt,却无法让它工作。我认为,因为任何时候我需要用户信息,它都会从我的数据库中返回信息,它有意义地发送带有请求的令牌并让我的api获取用户信息。
答案 0 :(得分:0)
这完全取决于您调用的API。我从来没有见过一个API,它需要的东西比它提供的access_token更多。你可能在这里有不正确的命名法。
你是说&#34;访问密钥&amp;秘密&#34 ;?或者你确定你有access_token吗?
在前一种情况下,API通常会按照以下方式进行操作:
Authorization Bearer|Basic
标头
如果您尝试将id_token
作为Authorization
标题传递,还值得一提吗?
同样值得一提的是,您是否可以向我们提供邮递员成功回复的屏幕截图(确保您对敏感数据进行模糊处理)。
同样值得指出代码的优化调整。由于您使用的是async
,因此您可能会对性能感到担忧。看看this文章,讨论HttpClient的可处置性。作为更好的选择,请使用HttpRequestMessage
,如下所示:
public async Task<string> GetResponseJsonString(string url)
{
string responseJsonString = null;
var req = new HttpRequestMessage(HttpMethod.Get, "/your/api/url");
req.Headers.Authorization = new AuthenticationHeaderValue("Bearer", access_token);
using (var resp = await client.SendAsync(req))
using (var s = await resp.Content.ReadAsStreamAsync())
using (var sr = new StreamReader(s))
{
if (resp.IsSuccessStatusCode)
{
responseJsonString = await sr.ReadToEndAsync();
}
else
{
string errorMessage = await sr.ReadToEndAsync();
int statusCode = (int)resp.StatusCode;
//log your error
}
}
return responseJsonString;
}
client
是对HttpClient
的静态共享实例的引用。我做这一切的首选方法是打包我的API调用,通常是每个服务一个文件。我将此服务作为单例注入,它将代理它自己的HttpClient
静态实例。如果您正在使用.NET Core,则此设置更加简单。