使用 HttpRequester 更方便的发起 HTTP 请求

原文:使用 HttpRequester 更方便的发起 HTTP 请求

使用 HttpRequester 更方便的发起 HTTP 请求

Intro

一直感觉 .net 里面(这里主要说的是 .net framework 下)发送 HTTP 请求的方式用着不是特别好用,而且在 .net framework 里发送 HTTP 请求的方式有好几种,如:WebClient/WebRequest/HttpClient,于是自己封装了一个?HttpRequester

WebClient 主要是用来下载,不能对 HTTP 做较多的自定义,HttpClient 是微软后来加入的,也是比较推荐使用的处理 HTTP 请求的,但是在 .net framework 下如果不注意的话可能会造成很大的灾难,从 .net core 2.1 开始,微软引入了 HttpClientFactory 去解决了一些问题,如果你是在 .net core 程序下跑的话,推荐使用 HttpClient,如果在 .net framework 下跑的话可以使用 WebRequest,这里说明一下,.net core 下,WebRequest 内部也是基于 HttpClient 的,详细可以参考 https://github.com/dotnet/corefx/blob/master/src/System.Net.Requests/src/System/Net/HttpWebRequest.cs#L1096

HttpRequester 是基于 WebRequest 封装的,使用比较简洁的 Fluent API 的方式调用,如果是在 .net framework 下开发,可以尝试使用一下,具体使用可以参考下面的示例以及 Github 上的示例代码 示例代码2

添加 Nuget 包引用

添加对 WeihanLi.Common 的引用,需要 1.0.14 及以上版本

使用 HttpRequester


var result = new HttpRequester("https://weihanli.xyz") // 使用 GET 方式请求 https://weihanli.xyz
                .Execute(); // 返回 responseText
System.Console.WriteLine(result);

 // 使用 POST 方法请求 https://accounting.weihanli.xyz/Account/LogOn
var loginResult = new HttpRequester("https://accounting.weihanli.xyz/Account/LogOn", HttpMethod.Post)
                .WithHeaders(new Dictionary<string, string>()
                {
                    { "X-Requested-With", "XMLHttpRequest" },
                }) // 设置请求头
                // .AjaxRequest(true)
                // 设置 Referer,在做爬虫时会比较有用,还可以通过 WithProxy("proxyUrl") 设置代理
                .WithReferer("https://accounting.weihanli.xyz/Account/Login?ReturnUrl=%2F")
                // 手动设置 UserAgent,默认会随机设置一个 UA
                .WithUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36")
                .WithFormParameters(new Dictionary<string, string>()
                {
                    {"Username","liweihan" },
                    {"Password", "112233" },
                    {"RememberMe","false" }
                }) // 设置 post 的 form 参数
                // 获取返回的 responseText,并 json 反序列化为一个强类型的Model
               .Execute<WeihanLi.Common.Models.JsonResultModel<bool>>(); 

            System.Console.WriteLine(loginResult.ToJson());

// 上传文件示例
var uploadFileResponse = new HttpRequester("https://graph.baidu.com/upload", HttpMethod.Post)
                .WithFile([email protected]"{System.Environment.GetEnvironmentVariable("USERPROFILE")}\Pictures\4e6ab53e383863ed4d15252039f70423.jpg", "image", new Dictionary<string, string>()
                {
                    { "tn","pc" },
                    { "from","pc" },
                    { "image_source","PC_UPLOAD_SEARCH_FILE" },
                    { "range","{\"page_from\": \"searchIndex\"}" },
                }) // 设置上传文件,并设置其它 form 参数信息
                .WithReferer("https://baidu.com/") // 设置 referer
                .WithUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36")
                .ExecuteForResponse(); // 获取一个 HttpWebResponse 对象,可以使用 StatusCode/ ResponseHeader 等信息
            System.Console.WriteLine($"Response status:{uploadFileResponse.StatusCode}, result:{uploadFileResponse.ReadToEnd()}");

More

除了 Header/Referer/UserAgent 之外,还可以设置 Proxy,设置 Cookie,Ajax 请求 等信息,而且还可以直接 PostJson 示例如下:

new HttpRequester("requestUrl", HttpMethod.Post)
  .WithProxy("proxyUrl") // 使用代理 //.WithProxy("url", "userName", "password") // 配置带密码的代理
  .WithCookie(cookie) //带 Cookie 访问 //.WithCookie("url", cookie) // 只用指定路径的 cookie
  .WithJsonParameter(entity) // post 一个 json 对象,content-type 会自动设置为 `application/json`
  .AjaxRequest(true) // 设置该请求是 Ajax 请求
  .Execute();

Memo

欢迎体验~,如果有什么问题或者发现什么 bug 欢迎和我联系或者给我提 issue

原文地址:https://www.cnblogs.com/lonelyxmas/p/10850720.html

时间: 2024-08-03 18:04:25

使用 HttpRequester 更方便的发起 HTTP 请求的相关文章

libcurl发起post请求时间延迟问题。except为空即可

最近在做团购酒店APP分享到qzone功能,使用libcurl访问qzone的分享cgi接口,酒店分享信息以POST方式传输,在测试的时候发现分享接口平均有2s的延迟,这延迟也太大了吧,于是乎问了空间的接口人,答曰:怎么可能,这个接口的平均调用时延是100-200ms,肯定是你的代码有问题.好吧,开始检查代码,使用strace -p跟踪系统调用,发现curl发送了两次请求,其中第一次请求的响应特别的慢,额,原来这个才是导致延迟的罪魁祸首,tcpdump之后发现curl发送的第一个请求包含一个Ex

用curl发起https请求

使用curl发起https请求 使用curl如果想发起的https请求正常的话有2种做法: 方法一.设定为不验证证书和host. 在执行curl_exec()之前.设置option $ch = curl_init(); ...... curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 方法二.设定一个正确的证书. 本地ssl判别证书太旧,导致链接报错ssl

C#的百度地图开发(一)发起HTTP请求

百度地图的开发文档中给出了很多的事例,而当用到具体的语言来开发时,又会有些差异.我是使用C#来开发的.在获取相应的数据时,需要通过URL传值,然后获取相应的返回值(这一点很多平台的开发都是如此:比如微信的企业号).所以我们第一步要解决的就是如何发起URL请求. 如果是在前端,我们可以很轻易的发起URL请求,就是在浏览器的地址栏中输入URL即可,那么在C#的后台要如何发起请求呢?来看下面的代码: [csharp] view plaincopy /// <summary> /// 向指定URL发起

发起https请求并获取结果

/**     * 发起https请求并获取结果     *      * @param requestUrl     *            请求地址     * @param requestMethod     *            请求方式     * @param outputStr     *            请求数据     * @return     * @throws Exception     */    public static String MsgHttpsR

接入支付宝支付接口(一):发起支付请求

一.前言 在接入支付宝接口之前,需要在支付宝官网进行应用注册和实名认证,地址不再贴出. 在此,贴出支付宝开放平台文档地址:https://docs.open.alipay.com/58/103585/ 在这个地址中,详细介绍了如何接入支付宝接口 二.发起请求 支付宝的签名方式等不做详细介绍,在开发文档中有详细说明,笔者建议:编码格式请使用UTF-8. 接下来的介绍中,主要贴出代码(代码仅供参考) 在贴出代码之前,首先大致了解一下如何发起支付请求: 第一步:组装阿里参数 该步骤组装的参数来自于商户

发起post请求

scrapy发起post请求的两种方式 一定要对start_requests方法进行重写 1.Request方法中给method属性复制成post 2.FormRequest()进行post请求的发送 方法1(不建议使用): import scrapy class PostexampleSpider(scrapy.Spider): name = 'postexample' # allowed_domains = ['www.baidu.com'] start_urls = ['https://w

利用python发起http请求:多条测试用例同时执行来测试登录接口

#1.导入requests模块 import requests #2.定义接口地址login_url='http://ip:9999/futureloan/mvc/api/member/login' #3.定义测试数据test_case=[{'case_id':1,'title':'正常登录','data':{'mobilephone':'13502288211','pwd':'123456'},'method':'get','expected':'10001'}, {'case_id':2,'

nodejs发起HTTPS请求并获取数据

var https = require('https'); var zlib = require('zlib'); var post_data="………………";//请求数据 var reqdata = JSON.stringify(post_data); var options = { hostname: '10.225.***.***', port: '8443', path: '/data/table/list', method: 'POST', rejectUnauthoriz

HttpUrlConnection发起POST请求

1 StringBuffer str=new StringBuffer(); 2 Map<String,Object> requestParamsMap = new HashMap<String, Object>(); 3 requestParamsMap.put("type",0);//添加绑定参数 4 Iterator it=requestParamsMap.entrySet().iterator();//获取迭代器 5 while(it.hasNext()