使用 httpClient.postasync 进行 web api 调用 .net core
Posted
技术标签:
【中文标题】使用 httpClient.postasync 进行 web api 调用 .net core【英文标题】:Using httpClient.postasync for web api calls .netcore 【发布时间】:2019-11-04 09:43:32 【问题描述】:我是 .netcore 的新手,我正在开发在 docker 容器上运行的 web api,并且在使用 postman 时,web api 的工作非常好,可以输出结果。我想在 .netcore 中创建一个程序,调用 webapi 端点并获取响应并在其他端点中使用 MVC 中的特定响应。
解释如下。
admin 的默认用户名和密码是默认设置的,例如 username:admin , password: helloworld
. admin 首次登录 api 需要一个新的个人密码,如下图 Postman 所示。
登录接口为:localhost://..../v1/users/login
第一个问题是如何使用 .netcore 在 Authorization->BasicAuth 中给出值。 api 的主体如下图所示。
设置 new_password 后,api 的响应是一个令牌,如下所示。
然后在环境中使用特定令牌来创建用户。下面给出了更清晰问题的图像。
最后,令牌随后用于进行其他 API 调用,例如创建用户。
API: https://localhost/..../v1/users
图片如下。
作为 .netcore 语言的新手,我真的很难进行这种 API 调用,因为我尝试的大多数教程都是从 API 生成自己的令牌,但在这里我只想获取响应令牌并保存然后在其他 API 调用中使用它。 *** 社区的支持对我来说总是很方便。
我正在尝试的代码如下。
**Controller**
public class Login_AdminController : ControllerBase
[Route("/loginAdmin")]
[HttpPost]
public async Task<string> LoginAdminAsync([FromBody] dynamic content)
LoginAdmin L = new LoginAdmin();
var client = new HttpClient();
client.BaseAddress = new Uri("https://localhost:9090");
var request = new HttpRequestMessage(HttpMethod.Post, "/v1/users/login");
var byteArray = new UTF8Encoding().GetBytes($"<L.username:L.df_Password>");
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
var formData = new List<KeyValuePair<string, string>>();
formData.Add(new KeyValuePair<string, string>("new_password", "helloWorld123!"));
request.Content = new FormUrlEncodedContent(formData);
var response = await client.SendAsync(request);
Console.WriteLine(response);
return content;
***Model***
public class LoginAdmin
public string username = "admin";
public string df_Password = "secret";
public string new_Password get; set;
谢谢。
【问题讨论】:
真的很难理解你的问题是什么。能否请您明确说明问题所在? 【参考方案1】:您想从响应中获取令牌吗?如是。试试这个:
var client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:12345/Api");
var request = new HttpRequestMessage(HttpMethod.Post, "/token");
var keyValues = new List<KeyValuePair<string, string>>();
keyValues.Add(new KeyValuePair<string, string>("username", "yourusername"));
keyValues.Add(new KeyValuePair<string, string>("password", "yourpassword"));
request.Content = new FormUrlEncodedContent(keyValues);
var response = client.SendAsync(request).Result;
return response.Content.ReadAsStringAsync().Result;
【讨论】:
谢谢!这对我有用。【参考方案2】:授权通过Authorization
请求标头处理,该标头将包含某种以方案为前缀的令牌。您在这里谈论的并不是真正的基本身份验证。这样,您就可以在每个请求中传递用户名并传入Authorization
标头。您所做的只是验证一次以获取身份验证令牌,然后使用该身份验证令牌来授权进一步的请求。在这种情况下,您确实应该发布用户名并传入请求正文。然后,您将使用 Authorization
标头对其他请求的令牌进行不记名身份验证。不过,要涵盖这两个基础:
基本认证
var token = Convert.ToBase64String(Encoding.UTF8.GetBytes($"username:password"));
request.Headers.Add("Authorization", $"Basic token");
不记名身份验证
request.Headers.Add("Authorization", $"Bearer token");
// where `token` is what was returned from your auth endpoint
FWIW,List<KeyValuePair<string, string>>
就是 Dictionary<string, string>
。最好使用真实类型。然后,您可以使用 formData.Add("new_password", "helloWorld123!")
而不是 formData.Add(new KeyValuePair<string, string>("new_password", "helloWorld123!"))
【讨论】:
以上是关于使用 httpClient.postasync 进行 web api 调用 .net core的主要内容,如果未能解决你的问题,请参考以下文章
为啥 HttpClient.PostAsync 似乎将请求作为 GET 而不是 POST 发送?