模拟请求(模拟header gzip解压 泛型)
WebClient
HeaderData是自定义类对象,存储header信息
private static T GetDataCommonMethod<T>(string url, string host, HeaderData headerData) where T : class
{
//注意Host和请求基网址各个请求可能不同
var client = new WebClient();
var headerStr = $"Host: {host}" + "\n" +
"User-Agent: ......" + "\n" +
@"Accept: application/json, text/plain, */*" + "\n" +
"Accept-Encoding: gzip, deflate" + "\n" +
"Accept-Language: zh-cn" + "\n" +
$"Cookie: m={headerData.m}; u={headerData.u}; wx={headerData.wx}; ......" + "\n";
var rawHeaders = headerStr.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries).ToList();
var headerPairs = rawHeaders.Select(x =>
{
var items = x.Split(new[] { ':' }, 2, StringSplitOptions.RemoveEmptyEntries);
var key = items[0].Trim();
var value = items[1].Trim();
//ValueTuple是C# 7中的语法,.net framework框架在4.7以上自带
return new ValueTuple<string, string>(key, value);
}).ToList();
headerPairs.ForEach(x =>
{
client.Headers.Set(x.Item1, x.Item2);
});
//先gzip解压再转string
byte[] rawBytes = client.DownloadData(url);
var stream = new MemoryStream(rawBytes);
GZipStream g = new GZipStream(stream, CompressionMode.Decompress);
//gzip最后四位是原始长度
var length = BitConverter.ToInt32(rawBytes, rawBytes.Length - 4);
byte[] bytes = new byte[length];
g.Read(bytes, 0, bytes.Length);
//编码是UTF8
string s0 = System.Text.Encoding.UTF8.GetString(bytes); T result = JsonConvert.DeserializeObject<T>(s0);
return result;
}
HttpClient
var baseAddress = new Uri("");
var yourText = "";
//UseCookies:处理程序是否使用 CookieContainer 属性来存储服务器Cookie 并在发送请求时使用这些 Cookie
using (var handler = new HttpClientHandler { UseCookies = false })
using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
{
var formContent = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("id", "1")
});
//此处确定请求方式(POST)
var message = new HttpRequestMessage(HttpMethod.Post, "");
//添加Cookie信息
message.Headers.Add("Cookie", yourText);
message.Content = formContent;
//使用SendAsync方法,把请求传进去HttpRequestMessage
var result = await client.SendAsync(message);
strContent = await result.Content.ReadAsStringAsync();
var retObj = JsonConvert.DeserializeObject<ResultDto>(strContent);
}
注意事项
1.不能带
Connection: keep-alive
报错:InnerException = {"Keep-Alive 和 Close 不能使用此属性设置。\r\n参数名: value"}
2."User-Agent","Accept-Language","application/json"这些,注意中间不要有空格
报错:指定的值含有无效的 HTTP 标头字符。\r\n参数名: name
模拟请求(模拟header gzip解压 泛型)的更多相关文章
- Android获取网络数据进行GZIP解压
说明:现在很多网站都会在回传数据的时候进行GZIP压缩,我们可以在请求头中申明支持GZIP压缩.可以减轻网络传输压力,Xutils中已经实现. 下面是一个DEMO,便于理解. private void ...
- httplib 和 httplib2区别之 gzip解压
HTTP请求头Accept-encoding: gzip信息告诉服务器,如果它有任何新数据要发送给时,请以压缩的格式发送.如果服务器支持压缩,它将返回由 gzip 压缩的数据并且使用Content-e ...
- VB6进行GZIP解压&C#进行GZIP压缩和解压
VB进行GZIP解压的,DLL是系统的,如果没有 [点击下载] Option Explicit 'GZIP API '----------------------------------------- ...
- iOS gzip解压
1. 导入libz库(如:libz 1.2.5.dylib) 2. 引入头文件 #import "zlib.h" 3. 实现解压(输入输出都为NSData对象) -(NSData ...
- asp.net实现GZip压缩和GZip解压
最近在开发一个网站doc.115sou.com,使用到了GZip压缩技术,经过多次搜索找到asp.net中用GZip对数据压缩和解压缩非常方便,当我第一次拿到这个类的时候却感觉很迷茫,无从下手.主要是 ...
- gzip解压和压缩
我发现网上很少有这样完整例子,加上英文有不好,走了好多弯路.我现在把从网上找到例子帖出来,可以解压HTTP gzip的 #include <stdlib.h> #include <s ...
- gzip解压压缩的字符串数据
import urllib2 from StringIO import StringIO import gzip def loadData(url): request = urllib2.Reques ...
- gzip解压文件报错
#tar -xvf jdk-8u131-linux-x64.tar.gz,执行命令后报错如下: gzip: stdin: not in gzip format tar: Child returned ...
- 5.post上传和压缩、插件模拟请求
gzip gzip一种压缩方式,或者是文件形式,它主要用于网络传输数据的压缩 gzip压缩好不好用 浏览器:网速一定.内容越小.请求响应的速度是不是更快 手机server:返回数据类型是json/ ...
随机推荐
- thinkphp5项目--练手--企业单车网站(九)(友情链接)
thinkphp5项目--练手--企业单车网站(九)(友情链接) 项目地址 fry404006308/BicycleEnterpriseWebsite: Bicycle Enterprise Webs ...
- php函数实现显示几秒前,几分钟前,几天前等方法(网络上什么都有)
php函数实现显示几秒前,几分钟前,几天前等方法(网络上什么都有) 一.总结 网络上面什么函数都有 二.php函数实现显示几秒前,几分钟前,几天前等方法 现在很多网站的时间显示都很人性化,不再是单纯的 ...
- Opencv Sift算子特征提取与匹配
SIFT算法的过程实质是在不同尺度空间上查找特征点(关键点),用128维方向向量的方式对特征点进行描述,最后通过对比描述向量实现目标匹配. 概括起来主要有三大步骤: 1.提取关键点: 2.对关键点附加 ...
- 从show slave status 中1062错误提示信息找到binlog的SQL
mysql> show slave status\G *************************** 1. row *************************** Slave_I ...
- MVC4中AJAX Html页面打开调用后台方法实现动态载入数据库中的数据
之前一直用window.onload方法来调用js方法来实现,今天纠结能不能换个方法实现. 非常明显是能够的. 在html前台页面引用js代码例如以下 @Scripts.Render("~/ ...
- 基于 Android NDK 的学习之旅-----HelloWorld
Hello World作为所有编程语言的起始阶段,占据着无法改变的地位,所有中/英/法/德/美……版本的编程教材中,hello world总是作为第一个TEST记录于书本之中,所有的编程第一步就在于此 ...
- 切换-5.7-GTID复制切换成传统复制
mysql5.7 gtid和传统复制在线切换,5.7.6 之后 不用重启可以直接在线切换 基本环境 Master Slave MySQL版本 MySQL-5.7.16-X86_64 MySQL ...
- 使用Toolbar + DrawerLayout快速实现高大上菜单侧滑
如果你有在关注一些遵循最新的Material Design设计规范的应用的话(如果没有,假设你有!),也许会发现有很多使用了看起来很舒服.很高大上的侧滑菜单动画效果,示例如下(via 参考2): 今天 ...
- Android中蓝牙的基本使用----BluetoothAdapter类简介
天气逐渐热了,自己也越来越懒了,虽然看着了很多东西,解决了很多问题,有些收获却不想写着.主要有一下两方面原因: 第一.以前写的一些关于Android知识的Blog,都是在学习过程中发现网络上没有相关知 ...
- [Redux] Important things in Redux
Root Smart component can be overloaded, divide 'smart' component wisely & using Provider. Proble ...