Spring5之WebClient简单使用

Spring5之WebClient简单使用,第1张

Spring3.0引入了RestTemplate,但是在后来的官方源码中介绍,RestTemplate有可能在未来的版本中被弃用,所谓替代RestTemplate,在Spring5中引入了WebClient作为非阻塞式Reactive Http客户端。

采用阻塞IO模式获取输入数据。每个连接都需要独立的线程,完成数据输入、业务处理、返回。传统阻塞IO模型的问题是,当并发数很大时,就要创建大量线程,占用很大的系统资源。连接创建后,如果当前线程暂时没有数据可读,该线程会阻塞在read *** 作,造成线程资源浪费。

SpringMVC或Struct等框架都是基于Servlet的,其底层IO模型是阻塞IO模型。Spring社区为了解决SpringMVC的阻塞模型在高并发场景下的性能瓶颈,推出了Spring WebFlux,WebFlux底层实现是久经考验的Netty非阻塞IO通信框架。其实WebClient处理单个HTTP请求的响应时长并不比RestTemplate更快,但是它处理并发的能力更强。 所以响应式非阻塞IO模型的核心意义在于,提高了单位时间内有限资源下的服务请求的并发处理能力,而不是缩短了单个服务请求的响应时长。

uriBuilderFactory:自定义UriBuilderFactory灵活配置使用Url

defaultHeader:为HTTP请求设置Headers请求头

defaultCookie:为HTTP请求设置Cookies

defaultRequest:自定义HttpRequest

filter:为HTTP请求增加客户端过滤器

exchangeStrategies:HTTP读写信息自定义

clientConnector:HTTP客户端连接器设置

使用Mono和Flux接收返回结果,一个Mono对象包含0个或1个元素,而一个Flux对象包含1个或多个元素。

如果要设置也是一样的

[code=csharp]//设置Cookie

webBrowser1.Document.Cookie=strcookie[/code]

但是有时候使用这种方法会获取不全,或者是获取不到,下面我提供一个方法

[C#] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

//取当前webBrowser登录后的Cookie值

[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]

static extern bool InternetGetCookieEx(string pchURL, string pchCookieName, StringBuilder pchCookieData, ref int pcchCookieData, int dwFlags, object lpReserved)

//取出Cookie,当登录后才能取

private static string GetCookieString(string url)

{

// Determine the size of the cookie

int datasize = 256

StringBuilder cookieData = new StringBuilder(datasize)

if (!InternetGetCookieEx(url, null, cookieData, ref datasize, 0x00002000, null))

{

if (datasize <0)

return null

// Allocate stringbuilder large enough to hold the cookie

cookieData = new StringBuilder(datasize)

if (!InternetGetCookieEx(url, null, cookieData, ref datasize, 0x00002000, null))

return null

}

return cookieData.ToString()

}

在很多情况下我们会使用间进程的webBrowser去实现一些网页的请求和抓去,这个时候有部分网页是取不到Cookie的,那怎么办呢?下面我提供一个方法,应该99%的都能取到

使用方法也很简单

[code=csharp]//获取Cookie

string strcookie=GetCookieString(“你要获取Cookie的URl”)[/code]例如

[code=csharp]//获取Cookie

string strcookie=GetCookieString(“http://www.sufeinet.com”)[/code]

这样获取的是sufeinet.com的Cookie信息

webbrowser和ie是共享cookie的,你从ie里登录了之后webbrowser也是登录的,所以实现起来不是很容易,而且多用户登录的话肯定要多个线程,winform是不能多个线程每个线程里持有一个webBrowser的,以前做过多个线程每个线程持有一个WebClient,然后每个WebClient持有自己的cookie


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12053561.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存