使用 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&lt;KeyValuePair&lt;string, string&gt;&gt; 就是 Dictionary&lt;string, string&gt;。最好使用真实类型。然后,您可以使用 formData.Add("new_password", "helloWorld123!") 而不是 formData.Add(new KeyValuePair&lt;string, string&gt;("new_password", "helloWorld123!"))

【讨论】:

以上是关于使用 httpClient.postasync 进行 web api 调用 .net core的主要内容,如果未能解决你的问题,请参考以下文章

为啥 HttpClient.PostAsync 似乎将请求作为 GET 而不是 POST 发送?

异步等待 HttpClient.PostAsync 调用

如何等待PostAsync返回?

HttpClient.PostAsync 用于上传文件

如何正确使用 HttpClient PostAsync 参数?

await HttpClient.PostAsync 方法编译错误[重复]