C# 应用 - 使用 HttpWebRequest 发起 Http 请求
- helper 类封装
- 调用
1. 引用的库类
\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6\System.dll
System.Net.HttpWebRequest
2代码 helper 类封装
/// <summary>
/// REST帮助类
/// </summary>
public class RESTHelper
{
/// <summary>
/// 不含请求参数的URL
/// </summary>
public string EndPoint { get; set; }
/// <summary>
/// 请求动作
/// </summary>
public HttpVerb Method { get; set; }
/// <summary>
/// 请求格式(application/json,text/xml,application/x-www-form-urlencoded,multipart/form-data)
/// </summary>
public string ContentType { get; set; }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="endpoint">路径</param>
/// <param name="method">请求动作</param>
public RESTHelper(string endpoint, HttpVerb method)
{
EndPoint = endpoint;
Method = method;
ContentType = "application/json";
}
/// <summary>
/// 将对象转换为json格式然后命令,一般是使用post请求
/// </summary>
/// <param name="jsonmodel">参数对象,不能传入string类型</param>
/// <param name="encode">字符编码,可为null</param>
/// <returns></returns>
public string MakeJsonPostRequest(object jsonmodel, Encoding encode = null, WebHeaderCollection headerCollection = null)
{
string postData = "";
if (jsonmodel != null)
{
//将对象序列化为json字符串,忽略null值
postData = JsonConvert.SerializeObject(jsonmodel, new Newtonsoft.Json.JsonSerializerSettings { NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore, DateFormatString = "yyyy-MM-dd HH:mm:ss" });
}
return MakeRequest("", postData, encode, headerCollection);
}
/// <summary>
/// 发送请求,包含url的参数和请求数据
/// </summary>
/// <param name="parameters">请求参数,如page=1&page_size=20</param>
/// <param name="postData">请求数据</param>
/// <param name="encode">字符编码,可为null</param>
/// <returns></returns>
public string MakeRequest(string parameters, string postData, Encoding encode = null, WebHeaderCollection headerCollection = null)
{
// endpoint与请求参数拼接成完整的请求url
string requesturlstring = EndPoint + (string.IsNullOrEmpty(parameters) ? "" : "?" + parameters);
// 请求前记录日志
DateTime dt = DateTime.Now;
if (WriteLog.LoggerInstance.IsDebugEnabled) WriteLog.WriteLogger.Debug("[REST请求] 请求时间:" + dt.ToString("mm:ss.fff") + "\r\nURI:" + requesturlstring + "\r\n发送请求:" + postData);
// 初始化http请求
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requesturlstring);
if (headerCollection != null)
request.Headers = headerCollection;
request.Method = Method.ToString();
request.ContentLength = 0;
request.ContentType = ContentType;
request.Timeout = ConfigInfo.RESTTimeOut;
//request.Credentials = new NetworkCredential("username", "password");//传入验证信息
// 编码格式
encode = encode == null ? Encoding.UTF8 : encode;
// POST时,向流写入postData数据
if (!string.IsNullOrEmpty(postData) && Method == HttpVerb.POST)
{
var bytes = encode.GetBytes(postData);
// 设置请求数据的长度
request.ContentLength = bytes.Length;
using (var writeStream = request.GetRequestStream())
{
writeStream.Write(bytes, 0, bytes.Length);
}
}
// 返回值
var responseValue = string.Empty;
// 获取返回值
using (var response = (HttpWebResponse)request.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
using (var reader = new StreamReader(responseStream, encode))
{
responseValue = reader.ReadToEnd();
// 记录返回结果日志
if (WriteLog.LoggerInstance.IsDebugEnabled) WriteLog.WriteLogger.Debug("[REST结果] 请求时间:" + dt.ToString("mm:ss.fff") + "\r\nURI:" + requesturlstring + "\r\n返回数据:" + responseValue);
return responseValue;
}
}
}
}
/// <summary>
/// 将json字符串转换为对象(使用DataContractJsonSerializer)
/// </summary>
/// <param name="response"></param>
/// <param name="dateformatstring">时间格式</param>
/// <returns></returns>
public T ConvertJson<T>(string response)
{
try
{
DataContractJsonSerializer Serializer = new DataContractJsonSerializer(typeof(T));
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(response)))
{
return (T)Serializer.ReadObject(stream);
}
}
catch (Exception ex)
{
WriteLog.WriteLogger.Error("将json字符串转换为对象出错!\r\njson为:" + response, ex);
return default(T);
}
}
/// <summary>
/// 将json字符串转换为对象(使用Json.net)
/// </summary>
/// <param name="response"></param>
/// <param name="dateformatstring">时间格式</param>
/// <returns></returns>
public T JsonNetConvertJson<T>(string response)
{
try
{
JsonSerializerSettings jsSetting = new JsonSerializerSettings();
jsSetting.NullValueHandling = NullValueHandling.Ignore;
return JsonConvert.DeserializeObject<T>(response, jsSetting);
//return JsonConvert.DeserializeObject<T>(response);
}
catch (Exception ex)
{
Common.WriteLog.Error("将json字符串转换为对象出错!\r\njson为:" + response, ex);
return default(T);
}
}
}
/// <summary>
/// http请求方法/动作
/// </summary>
public enum HttpVerb
{
GET,
POST,
PUT,
DELETE
}
3. 调用
public class AClass{}
public AClass RequestAClass(string id)
{
AClass entity = null;
try
{
var uri = ConfigInfo.GetRestUri("GetAClassInfo");
// 参数校验
if (string.IsNullOrEmpty(id))
return null;
var restHelper = new RESTHelper(uri.Uri, HttpVerb.GET);
var jsonString = restHelper.MakeRequest(id);
entity = restHelper.ConvertJson<PrisonerInfoResponseModel>(jsonString);
}
catch (Exception exception) {}
return entity;
}
4. Http 系列
4.1 发起请求
使用 HttpWebRequest 发起 Http 请求:https://www.cnblogs.com/MichaelLoveSna/p/14501036.html
使用 WebClient 发起 Http 请求 :https://www.cnblogs.com/MichaelLoveSna/p/14501582.html
使用 HttpClient 发起 Http 请求:https://www.cnblogs.com/MichaelLoveSna/p/14501592.html
使用 HttpClient 发起上传文件、下载文件请求:https://www.cnblogs.com/MichaelLoveSna/p/14501603.html
4.2 接受请求
使用 HttpListener 接受 Http 请求:https://www.cnblogs.com/MichaelLoveSna/p/14501628.html
使用 WepApp 接受 Http 请求:https://www.cnblogs.com/MichaelLoveSna/p/14501612.html
使用 WepApp 处理文件上传、下载请求:https://www.cnblogs.com/MichaelLoveSna/p/14501616.html
C# 应用 - 使用 HttpWebRequest 发起 Http 请求的更多相关文章
- C# 应用 - 使用 HttpClient 发起 Http 请求
1. 需要的库类 \Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2\System.Net.Http.dll System.N ...
- C# 应用 - 使用 WebClient 发起 Http 请求
1. 需要的库类 \Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2\System.dll System.Net.WebCli ...
- 【转】asp.net(c#)使用HttpWebRequest附加携带请求参数以post方式模拟上传大文件(以图片为例)到Web服务器端
原文地址:http://docode.top/Article/Detail/10002 目录: 1.Http协议上传文件(以图片为例)请求报文体内容格式 2.完整版HttpWebRequest模拟上传 ...
- 发起post请求
string postUrl = "https://api.mch.weixin.qq.com/mmpaymkttransfers/gethbinfo"; //string req ...
- 使用 HttpRequester 更方便的发起 HTTP 请求
使用 HttpRequester 更方便的发起 HTTP 请求 Intro 一直感觉 .net 里面(这里主要说的是 .net framework 下)发送 HTTP 请求的方式用着不是特别好用,而且 ...
- NET MVC全局异常处理(一) 【转载】网站遭遇DDoS攻击怎么办 使用 HttpRequester 更方便的发起 HTTP 请求 C#文件流。 Url的Base64编码以及解码 C#计算字符串长度,汉字算两个字符 2019周笔记(2.18-2.23) Mysql语句中当前时间不能直接使用C#中的Date.Now传输 Mysql中Count函数的正确使用
NET MVC全局异常处理(一) 目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关 ...
- 根据URL发起HTTP请求,我的HTTPHelper。
完整的demo using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...
- .net 模拟发起HTTP请求(用于上传文件)
用C#在服务端发起http请求,附上代码一 /// <summary> /// 文件帮助类 /// </summary> public class FileHelper { / ...
- C#发起Http请求,调用接口
//方法1. Post 异步请求,普通的异步请求,传输普通的字符串等,对于有html代码的字段值的传输支持不好,如果需要传输html,二进制等数据的传输,请使用下面第二个方法,即使用UploadDat ...
随机推荐
- 自己动手实现springboot运行时执行java源码(运行时编译、加载、注册bean、调用)
看来断点.单步调试还不够硬核,根本没多少人看,这次再来个硬核的.依然是由于apaas平台越来越流行了,如果apaas平台选择了java语言作为平台内的业务代码,那么不仅仅面临着IDE外的断点.单步调试 ...
- 洛谷P1119-灾后重建-floyd算法
洛谷P1119-灾后重建 题目描述 给出\(B\)地区的村庄数NN,村庄编号从\(0\)到\(N-1\),和所有\(M\)条公路的长度,公路是双向的. 给出第\(i\)个村庄重建完成的时间\(t_i\ ...
- 数学知识-欧拉函数&快速幂
欧拉函数 定义 对于正整数n,欧拉函数是小于或等于n的正整数中与n互质的数的数目,记作φ(n). 算法思路 既然求解每个数的欧拉函数,都需要知道他的质因子,而不需要个数 因此,我们只需求出他的质因子, ...
- Mac 开机时为什么突然响一下,duang
Mac 开机时为什么突然响一下,duang duang 一下 https://zh.wikipedia.org/wiki/Duang refs xgqfrms 2012-2020 www.cnblog ...
- Top 10 JavaScript errors
Top 10 JavaScript errors javascript errors https://rollbar.com/blog/tags/top-errors https://rollbar. ...
- css animation & animation-fill-mode
css animation & animation-fill-mode css animation effect https://developer.mozilla.org/en-US/doc ...
- react & redux data flow diagram
react & redux data flow diagram Redux 数据流程图
- Linux & bash & tcpdump
Linux & bash & tcpdump Linux & tcpdump https://www.tecmint.com/12-tcpdump-commands-a-net ...
- spring框架aop用注解形式注入Aspect切面无效的问题解决
由于到最后我的项目还是有个邪门的错没解决,所以先把文章大概内容告知: 1.spring框架aop注解扫描默认是关闭的,得手动开启. 2.关于Con't call commit when autocom ...
- MySQL的简单使用方法备忘
这只是一篇我的个人备忘录,写的是我常用的命令.具体可以参考"菜鸟教程" https://www.runoob.com/mysql/mysql-tutorial.html 登录(用户 ...