应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

.NET HttpClient和webapi相关的东东先记录一点。传递Authorization header,token

6564人阅读 2019/10/6 19:42 总访问:5179663 评论:0 收藏:0 手机
分类: .NET


get请求传递Authorization header,token

  1. string url = "你请求的url";
  2. string token = "your token";
  3. HttpClient client = new HttpClient();
  4. client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  5. client.DefaultRequestHeaders.Add("Authorization"$"Bearer {token}");
  6. string result = client.GetAsync(url).Result.Content.ReadAsStringAsync().Result;


Post,FormUrlEncodedContent传递参数

  1. public static void Main()
  2. {
  3.     HttpClient client = new HttpClient();
  4.     List<KeyValuePair<stringstring>> kvlist = new List<KeyValuePair<stringstring>>();
  5.     kvlist.Add(new KeyValuePair<stringstring>("aa""a"));
  6.     kvlist.Add(new KeyValuePair<stringstring>("bb""x"));
  7.     HttpContent content = new FormUrlEncodedContent(kvlist);
  8.     string result = client.PostAsync("http://localhost:8099/api/xx", content).Result.Content.ReadAsStringAsync().Result;
  9. }


Post,StringContent传递参数:

  1. public static void Main()
  2. {
  3.     HttpClient client = new HttpClient();
  4.     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  5.     StringContent strcontent = new StringContent(JsonConvert.SerializeObject(new { aa = "a", bb = "x" }), Encoding.UTF8, "application/json");
  6.     string result = client.PostAsync("http://localhost:8099/api/xx", strcontent).Result.Content.ReadAsStringAsync().Result;
  7.     Console.ReadLine();
  8. }


Post,StringContent传递参数,Json参数,传递header,token
和上面那个其实是一样的,就多传递了一个token

  1. public void SendMail()
  2. {
  3.     string token = "你的token";
  4.     HttpClient client = new HttpClient();
  5.     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  6.     client.DefaultRequestHeaders.Add("Authorization"$"Bearer {token}");
  7.     var content = new
  8.     {
  9.         fromPerson = "发件人",
  10.         mailTitle = "标题",
  11.         mailBody = "正文内容",
  12.         recipientArry = new List<string>() { "收件人1@qq.com""收件人2@qq.com" },
  13.     };
  14.     StringContent strcontent = new StringContent(JsonConvert.SerializeObject(content), Encoding.UTF8, "application/json");
  15.     string result = client.PostAsync("http://localhost:59154/api/SendMail", strcontent).Result.Content.ReadAsStringAsync().Result;
  16. }


简单封装一下,带token的get与post请求

代码如下:

  1. public class RequestTools
  2. {
  3.     /// <summary>
  4.     /// 封装通用的get请求
  5.     /// </summary>
  6.     /// <param name="baseAddress"></param>
  7.     /// <param name="token"></param>
  8.     /// <param name="url"></param>
  9.     /// <returns></returns>
  10.     public string Get(string baseAddress, string token, string url)
  11.     {
  12.         string questUrl = baseAddress + url;
  13.         HttpClient client = new HttpClient();
  14.         client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  15.         client.DefaultRequestHeaders.Add("Authorization"$"Bearer {token}");
  16.         string result = client.GetAsync(questUrl).Result.Content.ReadAsStringAsync().Result;
  17.         return result;
  18.     }
  19.     /// <summary>
  20.     /// 封装通用的Post请求
  21.     /// </summary>
  22.     /// <param name="baseAddress"></param>
  23.     /// <param name="token"></param>
  24.     /// <param name="url"></param>
  25.     /// <param name="data"></param>
  26.     /// <returns></returns>
  27.     public string Post(string baseAddress, string token, string url,object data)
  28.     {
  29.         string questUrl = baseAddress + url;
  30.         HttpClient client = new HttpClient();
  31.         client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  32.         client.DefaultRequestHeaders.Add("Authorization"$"Bearer {token}");
  33.         StringContent strcontent = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json");
  34.         string result = client.PostAsync(questUrl, strcontent).Result.Content.ReadAsStringAsync().Result;
  35.         return result;
  36.     }
  37. }

使用封装get请求:

  1. public override async Task OnStart(JobContext jobContext)
  2. {
  3.     // 从配置文件获取请求接口的基础地址
  4.     string baseAddress = SmartEDU.Utils.Appsettings.Configuration["ApiVisit:Address"];
  5.     // 获取token
  6.     TokenTools tokenTools = new TokenTools();
  7.     string token = await tokenTools.GetToken(jobContext);
  8.     // 通过工具类调用接口,并拿到返回数据后反序列化解析成需要的类
  9.     RequestTools requestTools = new RequestTools();
  10.     // 如果是本地接口的测试可以把baseAddress换成本地地址即可,比如:"http://localhost:8805"
  11.     string prodResult = requestTools.Get(baseAddress, token, "/prodedu/api/Report/GetYesterdayProjectAbnormal");
  12.     BaseApiWrapDto<ProjectExamineDto> projectExamineDto = JsonConvert.DeserializeObject<BaseApiWrapDto<ProjectExamineDto>>(prodResult);
  13. }

使用封装的post请求:

  1. public override async Task OnStart(JobContext jobContext)
  2. {
  3.     // 从配置文件获取请求接口的基础地址,一般都是配置域名或者内部ip等
  4.     string baseAddress = SmartEDU.Utils.Appsettings.Configuration["ApiVisit:Address"];
  5.     // 获取token
  6.     TokenTools tokenTools = new TokenTools();
  7.     string token = await tokenTools.GetToken(jobContext);
  8.     // 通过工具类调用接口
  9.     RequestTools requestTools = new RequestTools();
  10.     // 构建好接口需要的参数
  11.     var data = new
  12.     {
  13.         stdetailID = "3d6717e7300246249c260d18cc9b0279",
  14.         PageIndex = 1,
  15.         PageSize = 999,
  16.         Orders = new List<object>() {
  17.             new { OrderField = "teacherNames", IsDesc=true }
  18.         },
  19.     };
  20.     string prodResult = requestTools.Post(baseAddress, token, "/labroom/api/Report/GetSchoolClassOrCourseDataGather", data);
  21. }

post请求接收方的方法定义(这里的测试接口没有使用标准的restful定义,用restful标准定义的接口一样的不影响):

  1. [HttpPost]
  2. public ObjectResult GetSchoolClassOrCourseDataGather([FromBody] QuerSchoolLabDTO query)
  3. {
  4.     //换成AJ封装的方法  
  5.     return Success(rs.GetSchoolTeacherDataGather(query));
  6. }

接收实体QuerSchoolLabDTO的定义:

  1. public class QuerSchoolLabDTOQueryBase
  2. {
  3.     public string stdetailID { getset; }
  4.     /// <summary>
  5.     /// 0:课程数据,1:班级数据
  6.     /// </summary>
  7.     public int dataType { getset; }
  8.     /// <summary>
  9.     /// 多字段排序
  10.     /// </summary>
  11.     public List<OrderInfo> orders { getset; }
  12.        
  13. }
  14. /// <summary>
  15. /// 排序字段
  16. /// </summary>
  17. public class OrderInfo
  18. {
  19.     /// <summary>
  20.     /// 排序字段
  21.     /// </summary>
  22.     public string OrderField { getset; }
  23.     /// <summary>
  24.     /// 是否为降序
  25.     /// </summary>
  26.     public Boolean IsDesc { getset; }
  27. }




webapi中这样写可以接收到httpclient传递的参数

JObject是Newtonsoft.Json.Linq下面的。当然这种传递参数的写法,使用对象接收也是能接收到的比如:[FromBody] Mail mails


设置类型还可以直接点出来设置

  1. strcontent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
  2. strcontent.Headers.ContentType.CharSet = "utf-8";



HttpClient手动传递cookie信息

  1. //获取cookie的token信息
  2. string token;
  3. HttpContext.Request.Cookies.TryGetValue("token"out token);
  4. //发送请求携带token
  5. HttpClient httpClient = new HttpClient();
  6. var message = new HttpRequestMessage(HttpMethod.Post, "http://localhost:X5J/api/v1/Token");
  7. message.Headers.Add("Cookie""token=" + token); 
  8. var httpResponseHeaders = httpClient.SendAsync(message).Result;

如果是请求了一遍想要自带cookie的话可以这样做

  1. HttpClient httpClient = new HttpClient();
  2. httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  3. StringContent strcontent = new StringContent(JsonConvert.SerializeObject("aa"), Encoding.UTF8, "application/json");
  4. var message = new HttpRequestMessage(HttpMethod.Post, "your address");
  5. //设置cookie信息
  6. message.Headers.Add("Cookie""token=" + token);
  7. //设置contetn
  8. message.Content = strcontent;
  9. //发送请求
  10. var httpResponseHeaders = httpClient.SendAsync(message).Result;



一个简单的get请求示例

  1.         /// <summary>
  2.         /// HttpClient实现Get请求
  3.         /// </summary>
  4.         static async void dooGet()
  5.         {
  6.             string url = "http://localhost:52824/api/register?id=1&leval=5";
  7.             //创建HttpClient(注意传入HttpClientHandler)
  8.             var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
  9.             using (var http = new HttpClient(handler))
  10.             {
  11.                 //await异步等待回应
  12.                 var response = await http.GetAsync(url);
  13.                 //确保HTTP成功状态值
  14.                 response.EnsureSuccessStatusCode();
  15.                 //await异步读取最后的JSON(注意此时gzip已经被自动解压缩了,因为上面的AutomaticDecompression = DecompressionMethods.GZip)
  16.                 Console.WriteLine(await response.Content.ReadAsStringAsync());
  17.             }
  18.         }



传递参数的同时传递一个cookie

https://www.tnblog.net/aojiancc2/article/details/3834


c# HttpClient 给webapi post传递一个参数

https://www.tnblog.net/aojiancc2/article/details/3834



欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

.net HttpClient 请求报错:One or more errors occurred. (The SSL connection could not be established see inner exception.)

这是因为HttpClient请求的地址带https证书,如果遇到证书有问题,证书不合法什么的就请求不到了,我们可以这样设置一下解决...

.net HttpClient通用的请求封装

[TOC]封装的代码如下/// &lt;summary&gt; /// 通用的请求类封装AJ /// &lt;/summary&gt; public class NewRequestTools ...

css图片文字对齐问题

文字和图片写到一排经常会出现对不齐的问题 这样感觉图片会上来一点没有和文字对齐,如下图 但是如果修改下html结...

微信交易单号订单号的区别

一般第三方在线支付系统中都会有两类订单号transactionId 为支付系统的订单号,由支付系统生成,并在回调时传回给商户,用...

C ?、?? 问号2个问号的用法(类型?、对象?)

C# ?C# ???:单问号1.定义数据类型可为空。可用于对int,double,bool等无法直接赋值为null的数据类型进行null的赋值如这...

C out、ref关键字的用法区别

说说自己对out、ref的认识,面试问到的几率很高哟。out:classProgram { /* *out、ref都是引用传递,传递后使用都会改变...

SQL Server的几种分页方式效率

--topnotin方式 selecttop条数*fromtablename whereIdnotin(selecttop条数*页数Idfromtablename) --ROW_NUMBER()O...

Java中的堆栈以及堆栈的区别

在正式内容开始之前要说明一点,我们经常所说的堆栈堆栈是堆和栈统称,堆是堆,栈是栈,合在一起统称堆栈;  1.栈(stack)...

JSON对象JSON字符串的区别

JSON对象是直接可以使用JQuery操作的格式,如C#中可以用对象(类名)点出属性(方法)一样var str2 = { &quot;name&quot;: ...

css中单位pxem,remvh/vw的理解

&gt;px像素(Pixel)。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。em是相对长度单位。相对于当前对象内文本的字...

redis中主从、哨兵集群这三个有什么区别

主从模式:备份数据、负载均衡,一个Master可以有多个Slaves。sentinel(哨兵)发现master挂了后,就会从slave中重新选举一个...

用Linq解决商品其下sku的筛选排序查询

本是sql to linq的东西,但是用的框架是.core 2.1,所以就归到core里吧最近遇到一个稍微复杂点的小问题需求:商城的商品列...

谈谈对事件委托的理解

对于c#的程序员来说,事件和委托可能是一道坎,过去的人觉得很简单,没过去的人觉得这个堵得慌 ,每次用着都很难受。本人就...

渣渣学安卓之banner图首页布局

接上文,登录页写完,该上首页了。找度娘搜索 安卓APP首页布局,想借鉴下,没搜到相关代码。只能赶鸭子上架,自己琢磨。效...

渣渣学安卓之时间选择器文本框操作

一、时间选择器有时候我们做页面时需要时间选择器,先上效果图看了下android studio,没有这个样式的控件,找了下度娘发现...