C# HttpClient 的那些坑
时间:2021-09-17
本文章向大家介绍C# HttpClient 的那些坑,主要包括C# HttpClient 的那些坑使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
点击查看代码
///
/// HttpPost
///
/// 非【application/json】 建议使用 Method HttpPost 使用此方法可能会字符超长导致请求400
///
///
///
///
///
///
public static string HttpClientPost(string url, string requestJson, Dictionary headers = null,string contentType= "application/json")
{
try
{
string result = string.Empty;
Uri postUrl = new Uri(url);
using (var httpClient = new HttpClient())
{
if (headers != null)
{
foreach (var header in headers)
httpClient.DefaultRequestHeaders.Add(header.Key, header.Value);
}
using (HttpContent httpContent = new StringContent(requestJson))
{
if (headers != null)
{
foreach (var header in headers)
httpContent.Headers.Add(header.Key, header.Value);
}
httpContent.Headers.ContentType = new MediaTypeHeaderValue(contentType);
httpClient.Timeout = new TimeSpan(0, 0, 60);
result = httpClient.PostAsync(url, httpContent).Result.Content.ReadAsStringAsync().Result;
}
}
return result;
}
catch (Exception e)
{
throw e;
}
}
调用方式:
// model 为json对象
HttpClientPost("url",JsonConvert.SerializeObject(model))
当使用【ContentType】为【application/json】的时候,上述方法一点问题没有,参数长度也没有限制,然而使用【application/x-www-form-urlencoded】或使用【form-data】时,参数有了限制,长度和get请求的限制一致,而使用此方法请求,依然可以收到返回值,只不过返回值为空,响应抛出【400-bad request】的错误代码,就很迷惑。。。 然后调整成下列方法后,问题就其妙的解决了。
点击查看代码
///
/// 发起POST同步请求(Key Value)
/// Method【application/json】【application/x-www-form-urlencoded】
/// 参数超长时使用此方法
///
///
///
///
///
public static string HttpPost(string baseAddr, string path, FormUrlEncodedContent content,Dictionary header=null, string contentType ="")
{
try
{
string resultContent = string.Empty;
using (HttpClient client = new HttpClient())
{
// client.BaseAddress = new Uri(baseAddr);
// header
if (header != null)
foreach (var item in header)
{
content.Headers.Add(item.Key, item.Value);
}
if (!string.IsNullOrEmpty(contentType))
{
content.Headers.ContentType = new MediaTypeHeaderValue(contentType);
}
HttpResponseMessage response = client.PostAsync(baseAddr+path, content).Result;
resultContent = response.Content.ReadAsStringAsync().Result;
}
return resultContent;
}
catch (Exception)
{
throw;
}
}
使用方式:
点击查看代码
var content = new FormUrlEncodedContent(new[] {
// body 为请求接口的参数名称,依据个人实际需求调整;参数依然为json对象
new KeyValuePair("body", JsonConvert.SerializeObject(model))
});
HttpPost("url", "可移除", content, _header, "application/x-www-form-urlencoded")
这个时候,接口就可以使用了,并且上面这个方法可以在类型(contentType)中使用,不会出现参数超长及其他问题,唯一美中不足的是,参数格式化这块没有第一个方法简单。
这个问题困扰了一天的时间,特此记录下,表示我现在忐忑的心情。。
本文来自博客园,作者:ThinkWsir,转载请注明原文链接:https://www.cnblogs.com/thinkw/p/15304712.html
原文地址:https://www.cnblogs.com/thinkw/p/15304712.html
- Golang 序列化之 ProtoBuf
- Golang RPC 之 gRPC
- 解决连通性问题的四种算法
- 使用shell批量生成数据整合式迁移的脚本(r8笔记第52天)
- Jdbc知识点全整理,你值得拥有 (1)
- SSD: Single Shot MultiBox Detector 深度学习笔记之SSD物体检测模型
- dg broker校验失败的一个奇怪问题(r8笔记第50天)
- golang 几种字符串的连接方式
- 整理ING
- dg broker校验失败的一个奇怪问题(二) (r8笔记第51天)
- Jdbc知识点全整理,你值得拥有 (2)
- 抓住“新代码”的影子 —— 基于GoAhead系列网络摄像头多个漏洞分析
- Python 用OPEN读文件报错 ,路径以及r
- python 如何设置多线程
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法