程序模拟HTTP请求
1. 使用HttpClient
前面拼接StringContent
string strContent = "client_id=client&client_secret=secret&grant_type=client_credentials";
HttpContent content = new StringContent(strContent, Encoding.UTF8, "application/x-www-form-urlencoded");
使用await:
public async void GetResponse()
{
HttpClient client = new HttpClient();
Url = "http://xxxx";
ClientInfo info = new ClientInfo();
Json = JsonConvert.SerializeObject(info, Settings);
HttpContent content = new StringContent(Json, Encoding.UTF8, "application/json");
using (var response = await client.PostAsync(Url, content))
{
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
}
}
这里可判断请求的状态
var content = await client.PostAsync("http://localhost:5001/api/values/",httpContent);
switch (content.StatusCode)
{
case HttpStatusCode.OK:
Console.WriteLine(content.Content.ReadAsStringAsync().Result);
break;
case HttpStatusCode.Unauthorized:
//todo:重新申请token
break;
}
不使用await:
/// <summary>
/// 将GET请求发送到指定URI
/// </summary>
/// <param name="url">链接地址</param>
/// <returns>返回字符串</returns>
public static string HttpGet(string url)
{
string str = string.Empty;
using (HttpClient client = new HttpClient())
{
using (var response = client.GetAsync(url))
{
response.Result.EnsureSuccessStatusCode();
str = response.Result.Content.ReadAsStringAsync().Result;
}
}
return str;
}
需要认证的:
/// <summary>
/// 将GET请求发送到有身份验证的指定URI
/// </summary>
/// <param name="url">链接地址</param>
/// <param name="user">用户名</param>
/// <param name="password">密码</param>
/// <returns>返回字符串</returns>
public static string HttpGet(string url, string user, string password)
{
string str = string.Empty;
HttpClientHandler handler = new HttpClientHandler();
handler.Credentials = new NetworkCredential(user, password);
using (HttpClient client = new HttpClient(handler))
{
using (var response = client.GetAsync(url))
{
response.Result.EnsureSuccessStatusCode();
str = response.Result.Content.ReadAsStringAsync().Result;
}
}
return str;
}
Post请求:
/// <summary>
/// 将POST请求发送到指定URI
/// </summary>
/// <param name="url">链接地址</param>
/// <param name="content">正文(JSON)</param>
/// <returns>返回字符串</returns>
public static string HttpPost(string url, string content)
{
string str = string.Empty;
HttpContent httpcontent = new StringContent(content, Encoding.UTF8, "application/json");
using (HttpClient client = new HttpClient())
{
using (var response = client.PostAsync(url, httpcontent))
{
response.Result.EnsureSuccessStatusCode();
str = response.Result.Content.ReadAsStringAsync().Result;
}
}
return str;
}
需要认证的:
/// <summary>
/// 将POST请求发送到有身份验证的指定URI
/// </summary>
/// <param name="url">链接地址</param>
/// <param name="content">正文(JSON)</param>
/// <param name="user">用户名</param>
/// <param name="password">密码</param>
/// <returns>返回字符串</returns>
public static string HttpPost(string url, string content, string user, string password)
{
string str = string.Empty;
HttpClientHandler handler = new HttpClientHandler();
handler.Credentials = new NetworkCredential(user, password);
HttpContent httpcontent = new StringContent(content, Encoding.UTF8, "application/json");
using (HttpClient client = new HttpClient(handler))
{
if (url.Contains("https"))
{
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
ServicePointManager.Expect100Continue = false;
}
using (var response = client.PostAsync(url, httpcontent))
{
response.Result.EnsureSuccessStatusCode();
str = response.Result.Content.ReadAsStringAsync().Result;
}
}
return str;
}
2.使用HttpWebRequest
Get请求:
/// <summary>
/// 访问相关地址,并获取访问结果。
/// </summary>
/// <param name="url">连接地址。</param>
/// <returns>返回字符串。</returns>
public static string HttpRequest(string url)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "Get";
request.ContentType = "application/x-www-form-urlencoded";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string encoding = response.ContentEncoding;
)
{
encoding = "UTF-8"; //默认编码
}
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(encoding));
return reader.ReadToEnd();
}
需要认证的Get请求:
/// <summary>
/// 访问相关地址,并获取访问结果。
/// </summary>
/// <param name="url">连接地址。</param>
/// <param name="user">用户名。</param>
/// <param name="password">密码。</param>
/// <returns>返回字符串。</returns>
public static string HttpRequest(string url, string user, string password)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Credentials = new NetworkCredential(user, password);
request.Method = "Get";
request.ContentType = "application/json";
request.KeepAlive = false;
request.Accept = "*/*";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string encoding = response.ContentEncoding;
)
{
encoding = "UTF-8"; //默认编码
}
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(encoding));
return reader.ReadToEnd();
}
Post:
string url = "https://xxx.xx.xxx.xxx:xx/gateway/file";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
ServicePointManager.Expect100Continue = false;
request.Method = "Post";
request.ContentType = "application/x-www-form-urlencoded";
request.Accept = "application/octet-stream";
request.Timeout = * * ;
string param = "callerIp=8.8.8.8&charset=utf-8&language=zh_CN&merchantId=xxx";
byte[] data = Encoding.UTF8.GetBytes(param);
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(data, , data.Length);
}
Encoding encoding = Encoding.UTF8;
string responseData = String.Empty;
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding))
{
responseData = reader.ReadToEnd().ToString();
}
}
使用此方法需要注意参数需要HttpUtility.UrlEncode
/// <summary>
/// 将POST请求发送到指定URI
/// </summary>
/// <param name="url">地址</param>
/// <param name="content">内容</param>
/// <param name="contentType">MIME类型</param>
/// <param name="encode">编码</param>
/// <param name="timeOut">超时时间(单位:毫秒)</param>
/// <returns>响应内容</returns>
)
{
string result = null;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
if (url.Contains("https"))
{
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
ServicePointManager.Expect100Continue = false;
}
request.Method = "Post";
request.ContentType = contentType;
request.Timeout = timeOut;
byte[] data = encode.GetBytes(content);
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(data, , data.Length);
}
var responseStream = request.GetResponse().GetResponseStream();
using (var response = request.GetResponseAsync())
{
var stream = response.Result.GetResponseStream();
using (StreamReader sr = new StreamReader(stream))
{
result = sr.ReadToEnd();
}
}
return result;
}
3.使用WebClient:
不使用Json:
/// <summary>
/// 将POST请求发送到指定URI
/// </summary>
/// <param name="url">地址</param>
/// <param name="collection">参数集合</param>
/// <returns>字符串</returns>
public static string HttpPost(string url, System.Collections.Specialized.NameValueCollection collection)
{
string result = string.Empty;
using (WebClient client = new WebClient())
{
byte[] response = client.UploadValues(url, collection);
result = Encoding.UTF8.GetString(response);
}
return result;
}
同时上传文件和表单内容:
public class HttpRequestClient
{
#region //字段
private ArrayList bytesArray;
private Encoding encoding = Encoding.UTF8;
private string boundary = String.Empty;
#endregion
#region //构造方法
public HttpRequestClient()
{
bytesArray = new ArrayList();
string flag = DateTime.Now.Ticks.ToString("x");
boundary = "---------------------------" + flag;
}
#endregion
#region //方法
/// <summary>
/// 合并请求数据
/// </summary>
/// <returns></returns>
private byte[] MergeContent()
{
;
;
string endBoundary = "--" + boundary + "--\r\n";
byte[] endBoundaryBytes = encoding.GetBytes(endBoundary);
bytesArray.Add(endBoundaryBytes);
foreach (byte[] b in bytesArray)
{
length += b.Length;
}
byte[] bytes = new byte[length];
foreach (byte[] b in bytesArray)
{
b.CopyTo(bytes, readLength);
readLength += b.Length;
}
return bytes;
}
/// <summary>
/// 上传
/// </summary>
/// <param name="requestUrl">请求url</param>
/// <param name="responseText">响应</param>
/// <param name="username">用户名</param>
/// <param name="password">密码</param>
/// <returns></returns>
public bool Upload(String requestUrl, out String responseText, string username, string password)
{
WebClient webClient = new WebClient();
if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
{
webClient.Credentials = new NetworkCredential(username, password);
}
webClient.Headers.Add("Content-Type", "multipart/form-data; boundary=" + boundary);
if (requestUrl.Contains("https"))
{
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
ServicePointManager.Expect100Continue = false;
}
byte[] responseBytes;
byte[] bytes = MergeContent();
try
{
responseBytes = webClient.UploadData(requestUrl, "POST", bytes);
responseText = System.Text.Encoding.UTF8.GetString(responseBytes);
return true;
}
catch (WebException ex)
{
Stream responseStream = ex.Response.GetResponseStream();
responseBytes = new byte[ex.Response.ContentLength];
responseStream.Read(responseBytes, , responseBytes.Length);
}
responseText = System.Text.Encoding.UTF8.GetString(responseBytes);
return false;
}
/// <summary>
/// 设置表单数据字段
/// </summary>
/// <param name="fieldName">字段名</param>
/// <param name="fieldValue">字段值</param>
/// <returns></returns>
public void SetFieldValue(String fieldName, String fieldValue)
{
string httpRow = "--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}\r\n";
string httpRowData = String.Format(httpRow, fieldName, fieldValue);
bytesArray.Add(encoding.GetBytes(httpRowData));
}
/// <summary>
/// 设置表单文件数据
/// </summary>
/// <param name="fieldName">字段名</param>
/// <param name="filename">字段值</param>
/// <param name="contentType">内容内型</param>
/// <param name="fileBytes">文件字节流</param>
/// <returns></returns>
public void SetFieldValue(String fieldName, String filename, String contentType, Byte[] fileBytes)
{
string end = "\r\n";
string httpRow = "--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
string httpRowData = String.Format(httpRow, fieldName, filename, contentType);
byte[] headerBytes = encoding.GetBytes(httpRowData);
byte[] endBytes = encoding.GetBytes(end);
byte[] fileDataBytes = new byte[headerBytes.Length + fileBytes.Length + endBytes.Length];
headerBytes.CopyTo(fileDataBytes, );
fileBytes.CopyTo(fileDataBytes, headerBytes.Length);
endBytes.CopyTo(fileDataBytes, headerBytes.Length + fileBytes.Length);
bytesArray.Add(fileDataBytes);
}
public string GetAuthorization(string username, string password)
{
string authorization = string.Format("{0}:{1}", username, password);
return "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(authorization));
}
#endregion
}
调用方法:
string responseText = "";
Stream fs = file.InputStream;
byte[] fileBytes = new byte[file.ContentLength];
fs.Read(fileBytes, , file.ContentLength);
fs.Close(); fs.Dispose();
HttpRequestClient httpRequestClient = new HttpRequestClient();
httpRequestClient.SetFieldValue("file", Path.GetFileName(file.FileName), "application/octet-stream", fileBytes);
if (httpRequestClient.Upload(uri, out responseText, threadUserName, threadPassword))
{
//dosomething
}
else
{
context.Response.Write("上传失败" );
}
采用异步发送但同步接收:
/// <summary>
/// 将POST请求发送到指定URI
/// </summary>
/// <param name="url">地址</param>
/// <param name="collection">参数集合</param>
/// <param name="contentType">MIME类型</param>
/// <param name="acceptType">接收类型</param>
/// <returns>字节数组</returns>
public static byte[] HttpPost(string url, System.Collections.Specialized.NameValueCollection collection, string contentType,string acceptType)
{
using (WebClient client = new WebClient())
{
client.Headers.Add("Content-Type", contentType);
client.Headers.Add("Accept", acceptType);
if (url.Contains("https"))
{
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
ServicePointManager.Expect100Continue = false;
}
using (var response = client.UploadValuesTaskAsync(url, collection))
{
byte[] result= response.Result;
return result;
}
}
}
下载文件:
/// <summary>
/// 下载文件
/// </summary>
/// <param name="url">地址</param>
/// <param name="fileName">路径</param>
public static void DownloadFile(string url,string fileName)
{
WebClient client = new WebClient();
client.DownloadFile(url, fileName);
}
使用这个方法下载文件拿不到原来的文件名,可以改用下面的方法:
using (HttpClient client = new HttpClient())
{
using (var response = client.GetAsync(url))
{
response.Result.EnsureSuccessStatusCode();
var name = response.Result.Content.Headers.ContentDisposition.FileName.Replace("\"", "");
var buff = response.Result.Content.ReadAsByteArrayAsync().Result;
string filename = Path.Combine(path, name);
using (FileStream fs = new FileStream(filename, FileMode.OpenOrCreate))
{
fs.Write(buff, , buff.Length);
}
}
}
程序模拟HTTP请求的更多相关文章
- python_程序模拟浏览器请求及会话保持
python下读取一个页面的数据可以通过urllib2轻松实现请求 import urllib2 print urllib2.urlopen('http://www.baidu.com').read( ...
- 程序模拟浏览器请求及会话保持-python实现
http://www.cnblogs.com/zxlovenet/p/4006649.html
- .Net(c#)模拟Http请求之HttpWebRequest封装
一.需求: 向某个服务发起请求获取数据,如:爬虫,采集. 二.步骤(HttpWebRequest): 无非在客户端Client(即程序)设置请求报文(如:Method,Content-Type,Age ...
- 使用 jQuery Mockjax 插件模拟 Ajax 请求
在实际的开发过程中,前端后台协商好了统一的接口,就各自开始自己的任务了.这时候我有这么一个 Ajax 请求需要从后台获取数据: $.ajax({ url: '/products/' }).done(f ...
- 一步步教你为网站开发Android客户端---HttpWatch抓包,HttpClient模拟POST请求,Jsoup解析HTML代码,动态更新ListView
本文面向Android初级开发者,有一定的Java和Android知识即可. 文章覆盖知识点:HttpWatch抓包,HttpClient模拟POST请求,Jsoup解析HTML代码,动态更新List ...
- python模拟http请求2
发现了一个非常好用的第三方module:requests,模拟接口非常简单. 详细了解请移步:http://docs.python-requests.org/en/latest/ 非常不错 #!cod ...
- python模拟http请求
下文主要讲述如何利用python自带的库模拟http请求,为以后利用python做API测试做准备. 只讲述模拟http的过程,具体到自己用的时候,要以自己的应用为准做出适当的调整. #!coding ...
- 使用 HttpWebRequest 发送模拟 POST 请求
使用HttpWebRequest发送模拟POST请求 网页中,如果form的method="POST",这时点击submit按钮可以给服务器发送了一个POST请求,如果metho ...
- WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构
原文:WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构 细算起来,已经有好几个月没有真正的写过文章了.近半年以来,一直忙于我的第一本WCF专著<WCF技术剖析>的写作,一直 ...
随机推荐
- 多网卡下对ServerSocket以TCP协议绑定IP和端口的测试
一.引言:之前开发TCP协议的程序(C#里是Socket为主)都是基于主机上只有一个IP的,后来项目里涉及到了主机需要同时连接内外和外网的情况,在该主机上部署着一套WCS系统和一套WMS系统:WCS系 ...
- 一种基于Redis的10行代码实现IP频率控制方法
优点:可支持海量访问的频率控制,只需要增加Redis机器,单个Redis节点(只占用一个cpu core)即可支持10万/s以上的处理. 基于IP频率限制是种常见需求,基于Redis可以十分简单实现对 ...
- MFC框架仿真<三>R T T I
RTTI,简单的说,就是判定A类是否为B类的基类.将书本的内容最大程度的简化,如下图的类层次,现在解决的问题就是:判定“梨”是否是“红富士”的基类.
- (匹配)Fire Net --hdu --1045
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1045 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- shell 脚本 抽取指定数量的随机学生
#!/bin/bash # #!/bin/bash # read -p '输入数' c #指定抽取的学生人数 jw=('王浩' '谢云生' '黄科杨' '何星宇' '张宸兵' '邓培林' '刘桃' ' ...
- Android-fragment的替换
fragment的替换:是指一个Activity加载多个Fragment,当某些动作的时候在Activity替换Fragment显示: 昨天写的这几篇博客,Android-fragment简介-fra ...
- Java反射reflection与注解annotation的应用(自动测试机)
一.关于自动测试机 1.什么是自动测试机? 对类中的指定方法进行批量测试的工具 2.自动测试机有什么用? a.避免了冗长的测试代码 当类中的成员方法很多时,对应的测试代码可能会很长,使用测试能够让测试 ...
- CC2530学习路线-基础实验-GPIO 控制LED灯亮灭(1)
目录 1.前期预备知识 1.1 新大陆ZigBee模块LED灯电路 1.2 CC2530相关寄存器 1.3 寄存器操作技巧 1.4 CPU空转延时 1.4 操作流程图 2.程序代码 The End 1 ...
- .net生成条形码
1..net 标准库(.net standard 2.0) Nuget添加引用:ZXing.Net生成条形码,ZXing.Net.Bindings.ImageSharp生成图片 public stat ...
- 程序媛计划——mysql修改表结构
#查看表的结构 mysql> desc score; +------------+--------------+------+-----+---------+----------------+ ...