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解压 泛型)的更多相关文章

  1. Android获取网络数据进行GZIP解压

    说明:现在很多网站都会在回传数据的时候进行GZIP压缩,我们可以在请求头中申明支持GZIP压缩.可以减轻网络传输压力,Xutils中已经实现. 下面是一个DEMO,便于理解. private void ...

  2. httplib 和 httplib2区别之 gzip解压

    HTTP请求头Accept-encoding: gzip信息告诉服务器,如果它有任何新数据要发送给时,请以压缩的格式发送.如果服务器支持压缩,它将返回由 gzip 压缩的数据并且使用Content-e ...

  3. VB6进行GZIP解压&C#进行GZIP压缩和解压

    VB进行GZIP解压的,DLL是系统的,如果没有 [点击下载] Option Explicit 'GZIP API '----------------------------------------- ...

  4. iOS gzip解压

    1. 导入libz库(如:libz 1.2.5.dylib) 2. 引入头文件 #import "zlib.h" 3. 实现解压(输入输出都为NSData对象) -(NSData ...

  5. asp.net实现GZip压缩和GZip解压

    最近在开发一个网站doc.115sou.com,使用到了GZip压缩技术,经过多次搜索找到asp.net中用GZip对数据压缩和解压缩非常方便,当我第一次拿到这个类的时候却感觉很迷茫,无从下手.主要是 ...

  6. gzip解压和压缩

    我发现网上很少有这样完整例子,加上英文有不好,走了好多弯路.我现在把从网上找到例子帖出来,可以解压HTTP gzip的 #include <stdlib.h> #include <s ...

  7. gzip解压压缩的字符串数据

    import urllib2 from StringIO import StringIO import gzip def loadData(url): request = urllib2.Reques ...

  8. gzip解压文件报错

    #tar -xvf jdk-8u131-linux-x64.tar.gz,执行命令后报错如下: gzip: stdin: not in gzip format tar: Child returned ...

  9. 5.post上传和压缩、插件模拟请求

      gzip gzip一种压缩方式,或者是文件形式,它主要用于网络传输数据的压缩 gzip压缩好不好用 浏览器:网速一定.内容越小.请求响应的速度是不是更快 手机server:返回数据类型是json/ ...

随机推荐

  1. 安装Centos时“sda必须有一个GPT磁盘标签”

    http://jingyan.baidu.com/article/c45ad29c272326051753e2d1.html

  2. Android 应用中十大常见 UX 错误 分类: H1_ANDROID 2013-09-21 13:59 404人阅读 评论(0) 收藏

    转载自:http://www.apkbus.com/android-5661-1.html 摘要: Android 开发者关系团队每天都会试用无数的 App 或者受到无数的开发者发来的请求评测的 Ap ...

  3. LSH︱python实现局部敏感随机投影森林——LSHForest/sklearn(一)

    关于局部敏感哈希算法.之前用R语言实现过,可是由于在R中效能太低.于是放弃用LSH来做类似性检索.学了python发现非常多模块都能实现,并且通过随机投影森林让查询数据更快.觉得能够试试大规模应用在数 ...

  4. css3-5 css3鼠标、列表和尺寸样式怎么用(文字有关的样式会被继承)

    css3-5  css3鼠标.列表和尺寸样式怎么用(文字有关的样式会被继承) 一.总结 一句话总结:css标签中文字有关的样式会被继承.由常用样式记起. 1.鼠标常用样式有哪些? cursor:poi ...

  5. PHP移动互联网开发笔记(4)——自定义函数及数组

    一.自定义函数 自定义函数就是我们自己定义的函数,在PHP中自定义函数格式如下: function funname(arg1, arg2, arg3......){ //TODO return val ...

  6. [React Router v4] Use the React Router v4 Link Component for Navigation Between Routes

    If you’ve created several Routes within your application, you will also want to be able to navigate ...

  7. Hudson版本控制 (备注)

    http://www.ttlsa.com/tools/install-hudson-on-linux/

  8. Qt的paint函数重写,以及QPaint给一条线绘制箭头

    直接代码: QPainter *painter; static const double Pi = 3.14159265358979323846264338327950288419717; stati ...

  9. Vue中v-for不绑定key会怎样

    Vue的v-for不绑定key,默认行为和绑定key="index"是差不多的,官方没有默认这种行为的情况下,会导致所有列表DOM重新渲染.key="index" ...

  10. MySQL日期 专题

    一.MySQL 获得当前日期时间 函数 1.1 获得当前日期+时间(date + time)函数:now() mysql> select now();+--------------------- ...