webclient 设置get访问_webclient设置get转post - CSDN
精华内容
参与话题
  • WebClient 通过get和post请求api

    千次阅读 2017-11-01 17:37:04
    //get 请求  string url = string.Format("http://localhost:28450/api/values?str1=a&str2=b");  WebClient wc = new WebClient();  Encoding enc = Encoding.GetEncoding("UTF-8");  

    //get 请求
            string url = string.Format("http://localhost:28450/api/values?str1=a&str2=b");
            WebClient wc = new WebClient();
            Encoding enc = Encoding.GetEncoding("UTF-8");
            Byte[] pageData = wc.DownloadData(url);
            string re = enc.GetString(pageData);

     

    //post 请求
            string postData = "value=a";
            byte[] bytes = Encoding.UTF8.GetBytes(postData);
            WebClient client = new WebClient();
            client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
            client.Headers.Add("ContentLength", postData.Length.ToString());
            Encoding enc = Encoding.GetEncoding("UTF-8");
            byte[] responseData = client.UploadData("http://localhost:28450/api/values", "POST", bytes);
            string re = enc.GetString(responseData);

    展开全文
  • webclient详解(webservice)

    千次阅读 2017-10-07 20:28:18
    1、WebClient.create(String url):访问地址。 2、path(String url,Object parames):地址 和 参数 。 3、accept(String... types):接收的类型。 4、get/post(Object body, Class responseClass):发送的...

    WebClient 详解

    1、WebClient.create(String url):访问地址。

    2、path(String url,Object parames):地址 和 参数 。

    3、accept(String... types):接收的类型。

    4、get/post(Object body, Class<String> responseClass):发送的内容 和 返回的类型。

    5、设置超时(固定用法):

    展开全文
  • Spring(31)——WebClient介绍

    万次阅读 2018-07-28 10:15:54
    WebClient是从Spring WebFlux 5.0版本开始提供的一个非阻塞的基于响应式编程的进行Http请求的客户端工具。它的响应式编程的基于Reactor的。WebClient中提供了标准Http请求方式...可以通过WebClient.create()创建一...

     

    WebClient是从Spring WebFlux 5.0版本开始提供的一个非阻塞的基于响应式编程的进行Http请求的客户端工具。它的响应式编程的基于Reactor的。WebClient中提供了标准Http请求方式对应的get、post、put、delete等方法,可以用来发起相应的请求。下面的代码是一个简单的WebClient请求示例。可以通过WebClient.create()创建一个WebClient的实例,之后可以通过get()post()等选择调用方式,uri()指定需要请求的路径,retrieve()用来发起请求并获得响应,bodyToMono(String.class)用来指定请求结果需要处理为String,并包装为Reactor的Mono对象。

    WebClient webClient = WebClient.create();
    Mono<String> mono = webClient.get().uri("https://www.baidu.com").retrieve().bodyToMono(String.class);
    mono.subscribe(System.out::println);

    响应结果解析为对象

    当响应的结果是JSON时,也可以直接指定为一个Object,WebClient将接收到响应后把JSON字符串转换为对应的对象。比如下面这样。

    WebClient webClient = WebClient.create();
    Mono<User> mono = webClient.get().uri("http://localhost:8081/user/1").retrieve().bodyToMono(User.class);
    User user = mono.block();

    如果响应的结果是一个集合,则不能继续使用bodyToMono(),应该改用bodyToFlux(),然后依次处理每一个元素,比如下面这样。

    String baseUrl = "http://localhost:8081";
    WebClient webClient = WebClient.create(baseUrl);
    Flux<User> userFlux = webClient.get().uri("users").retrieve().bodyToFlux(User.class);
    userFlux.subscribe(System.out::println);

    如果需要通过Flux取到所有的元素构造为一个List,则可以通过如下的方式获取。

    List<User> users = userFlux.collectList().block();

    URL中使用路径变量

    URL中也可以使用路径变量,路径变量的值可以通过uri方法的第2个参数指定。下面的代码中就定义了URL中拥有一个路径变量id,然后实际访问时该变量将取值1。

    webClient.get().uri("http://localhost:8081/user/{id}", 1);

    URL中也可以使用多个路径变量,多个路径变量的赋值将依次使用uri方法的第2个、第3个、第N个参数。下面的代码中就定义了URL中拥有路径变量p1和p2,实际访问的时候将被替换为var1和var2。所以实际访问的URL是http://localhost:8081/user/var1/var2

    webClient.get().uri("http://localhost:8081/user/{p1}/{p2}", "var1", "var2");
    

    使用的路径变量也可以通过Map进行赋值。面的代码中就定义了URL中拥有路径变量p1和p2,实际访问的时候会从uriVariables中获取值进行替换。所以实际访问的URL是http://localhost:8081/user/var1/1

    Map<String, Object> uriVariables = new HashMap<>();
    uriVariables.put("p1", "var1");
    uriVariables.put("p2", 1);
    webClient.get().uri("http://localhost:8081/user/{p1}/{p2}", uriVariables);

    指定baseUrl

    在应用中使用WebClient时也许你要访问的URL都来自同一个应用,只是对应不同的URL地址,这个时候可以把公用的部分抽出来定义为baseUrl,然后在进行WebClient请求的时候只指定相对于baseUrl的URL部分即可。这样的好处是你的baseUrl需要变更的时候可以只要修改一处即可。下面的代码在创建WebClient时定义了baseUrl为http://localhost:8081,在发起Get请求时指定了URL为/user/1,而实际上访问的URL是http://localhost:8081/user/1

    String baseUrl = "http://localhost:8081";
    WebClient webClient = WebClient.create(baseUrl);
    Mono<User> mono = webClient.get().uri("user/{id}", 1).retrieve().bodyToMono(User.class);

    Form提交

    当传递的请求体对象是一个MultiValueMap对象时,WebClient默认发起的是Form提交。下面的代码中就通过Form提交模拟了用户进行登录操作,给Form表单传递了参数username,值为u123,传递了参数password,值为p123。

    String baseUrl = "http://localhost:8081";
    WebClient webClient = WebClient.create(baseUrl);
    
    MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
    map.add("username", "u123");
    map.add("password", "p123");
    
    Mono<String> mono = webClient.post().uri("/login").syncBody(map).retrieve().bodyToMono(String.class);

    请求JSON

    假设现在拥有一个新增User的接口,按照接口定义客户端应该传递一个JSON对象,格式如下:

    {
        "name":"张三",
        "username":"zhangsan"
    }

    客户端可以建立一个满足需要的JSON格式的对象,然后直接把该对象作为请求体,WebClient会帮我们自动把它转换为JSON对象。

    String baseUrl = "http://localhost:8081";
    WebClient webClient = WebClient.create(baseUrl);
    
    User user = new User();
    user.setName("张三");
    user.setUsername("zhangsan");
    
    Mono<Void> mono = webClient.post().uri("/user/add").syncBody(user).retrieve().bodyToMono(Void.class);
    mono.block();

    如果没有建立对应的对象,直接包装为一个Map对象也是可以的,比如下面这样。

    String baseUrl = "http://localhost:8081";
    WebClient webClient = WebClient.create(baseUrl);
    
    Map<String, Object> user = new HashMap<>();
    user.put("name", "张三");
    user.put("username", "zhangsan");
    
    Mono<Void> mono = webClient.post().uri("/user/add").syncBody(user).retrieve().bodyToMono(Void.class);
    mono.block();

    直接传递一个JSON字符串也是可以的,但是此时需要指定contentType为application/json,也可以加上charset。默认情况下WebClient将根据传递的对象在进行解析处理后自动选择ContentType。直接传递字符串时默认使用的ContentType会是text/plain。其它情况下也可以主动指定ContentType。

    String baseUrl = "http://localhost:8081";
    WebClient webClient = WebClient.create(baseUrl);
    
    String userJson = 
            "{" + 
            "    \"name\":\"张三\",\r\n" + 
            "    \"username\":\"zhangsan\"\r\n" + 
            "}";
    
    Mono<Void> mono = webClient.post().uri("/user/add").contentType(MediaType.APPLICATION_JSON_UTF8).syncBody(userJson).retrieve().bodyToMono(Void.class);
    mono.block();

    exchange

    前面介绍的示例都是直接获取到了响应的内容,可能你会想获取到响应的头信息、Cookie等。那就可以在通过WebClient请求时把调用retrieve()改为调用exchange(),这样可以访问到代表响应结果的org.springframework.web.reactive.function.client.ClientResponse对象,通过它可以获取响应的状态码、Cookie等。下面的代码先是模拟用户进行了一次表单的登录操作,通过ClientResponse获取到了登录成功后的写入Cookie的sessionId,然后继续请求了用户列表。在请求获取用户列表时传递了存储了sessionId的Cookie。

    String baseUrl = "http://localhost:8081";
    WebClient webClient = WebClient.create(baseUrl);
    
    MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
    map.add("username", "u123");
    map.add("password", "p123");
    
    Mono<ClientResponse> mono = webClient.post().uri("login").syncBody(map).exchange();
    ClientResponse response = mono.block();
    if (response.statusCode() == HttpStatus.OK) {
        Mono<Result> resultMono = response.bodyToMono(Result.class);
        resultMono.subscribe(result -> {
            if (result.isSuccess()) {
                ResponseCookie sidCookie = response.cookies().getFirst("sid");
                Flux<User> userFlux = webClient.get().uri("users").cookie(sidCookie.getName(), sidCookie.getValue()).retrieve().bodyToFlux(User.class);
                userFlux.subscribe(System.out::println);
            }
        });
    }

    WebClient.Builder

    除了可以通过WebClient.create()创建WebClient对象外,还可以通过WebClient.builder()创建一个WebClient.Builder对象,再对Builder对象进行一些配置后调用其build()创建WebClient对象。下面的代码展示了其用法,配置了baseUrl和默认的cookie信息。

    String baseUrl = "http://localhost:8081";
    WebClient webClient = WebClient.builder().baseUrl(baseUrl).defaultCookie("cookieName", "cookieValue").build();

    Builder还可以通过clientConnector()定义需要使用的ClientHttpConnector,默认将使用org.springframework.http.client.reactive.ReactorClientHttpConnector,其底层是基于netty的,如果你使用的是Maven,需要确保你的pom.xml中定义了如下依赖。

    <dependency>
        <groupId>io.projectreactor.ipc</groupId>
        <artifactId>reactor-netty</artifactId>
        <version>0.7.8.RELEASE</version>
    </dependency>

    如果对默认的发送请求和处理响应结果的编解码不满意,还可以通过exchangeStrategies()定义使用的ExchangeStrategies。ExchangeStrategies中定义了用来编解码的对象,其也有对应的build()方法方便我们来创建ExchangeStrategies对象。

    WebClient也提供了Filter,对应于org.springframework.web.reactive.function.client.ExchangeFilterFunction接口,其接口方法定义如下。

    Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next)

    在进行拦截时可以拦截request,也可以拦截response。下面的代码定义的Filter就拦截了request,给每个request都添加了一个名为header1的header,值为value1。它也拦截了response,response中也是添加了一个新的header信息。拦截response时,如果新的ClientResponse对象是通过ClientResponse.from(response)创建的,新的response是不会包含旧的response的body的,如果需要可以通过ClientResponse.Builderbody()指定,其它诸如header、cookie、状态码是会包含的。

    String baseUrl = "http://localhost:8081";
    WebClient webClient = WebClient.builder().baseUrl(baseUrl).filter((request, next) -> {
        ClientRequest newRequest = ClientRequest.from(request).header("header1", "value1").build();
        Mono<ClientResponse> responseMono = next.exchange(newRequest);
        return Mono.fromCallable(() -> {
            ClientResponse response = responseMono.block();
            ClientResponse newResponse = ClientResponse.from(response).header("responseHeader1", "Value1").build();
            return newResponse;
        });
    }).build();

    如果定义的Filter只期望对某个或某些request起作用,可以在Filter内部通过request的相关属性进行拦截,比如cookie信息、header信息、请求的方式或请求的URL等。也可以通过ClientRequest.attribute(attrName)获取某个特定的属性,该属性是在请求时通过attribute("attrName", "attrValue")指定的。这跟在HttpServletRequest中添加的属性的作用范围是类似的。

    关于WebClient使用的更多信息请参考其API文档。

    参考文档

    https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux-client

    (注:本文是基于Spring WebFlux 5.0.7所写)

     

    展开全文
  • 一、HttpClient模拟登录是通过post或get请求,登录后抓取的是静态页面,动态页面使用HtmlUnit public static void main(String[] args) throws IOException { HttpClient httpclient = new DefaultHttpClient()...
    一、HttpClient模拟登录是通过post或get请求,登录后抓取的是静态页面,动态页面使用HtmlUnit
    	public static void main(String[] args) throws IOException {
    		HttpClient httpclient = new DefaultHttpClient();
    		HttpPost httpost = new HttpPost("http://localhost:8080/jeefh/vworkerC/login"); // 登录url
    		List<NameValuePair> nvp = new ArrayList<NameValuePair>();
    		nvp.add(new BasicNameValuePair("loginname", "白斐"));
    		nvp.add(new BasicNameValuePair("password", "123456"));
    		nvp.add(new BasicNameValuePair("isRemember", "1"));
    		String sCharSet = "utf-8";
    		httpost.setEntity(new UrlEncodedFormEntity(nvp, sCharSet));
    		HttpResponse response = httpclient.execute(httpost);
    		String str = EntityUtils.toString(response.getEntity()); // post请求成功后的返回值
    		String cookie = response.getLastHeader("Set-Cookie").getValue(); // 获取cookie值
    		HttpGet index = new HttpGet("http://localhost:8080/jeefh/main"); // 数据接口url
    		index.setHeader("Cookie", cookie); // 设置之前获取到的cookie
    		index.setHeader("Content-Type", "application/json;charset=UTF-8");
    		HttpResponse response1 = httpclient.execute(index);
    		str = EntityUtils.toString(response1.getEntity()); // 取到的数据
    		System.out.println(str);
    		Document doc= Jsoup.parse(str);
    		Element table = doc.getElementById("my_task_lisk");
    	}

    :iframe引入的url在doc里查看

    maven:

    <dependency> 
        <groupId>org.apache.httpcomponents</groupId> 
        <artifactId>httpclient</artifactId> 
        <version>4.5.2</version>         
    </dependency> 
    <dependency> 
        <groupId>org.apache.httpcomponents</groupId> 
        <artifactId>httpmime</artifactId> 
        <version>4.5.2</version>    
    </dependency>      
    
    

    效果:

    二、HtmlUnit模拟登录

    	public static void main(String[] args) throws IOException {
    		WebClient webClient = new WebClient(BrowserVersion.CHROME);//设置浏览器
    		webClient.getOptions().setCssEnabled(false);//设置css是否生效
    		webClient.getOptions().setJavaScriptEnabled(true);//设置js是否生效
                    webClient.getOptions().setThrowExceptionOnScriptError(false);//设置是否抛js异常
    		webClient.setAjaxController(new NicelyResynchronizingAjaxController());//设置ajax请求
    		webClient.getOptions().setTimeout(10000);
    		webClient.waitForBackgroundJavaScript(3000);
    		HtmlPage htmlPage = webClient.getPage("http://localhost:8080/jeefh/login");//访问路径设置
    		//System.out.println(page.asText());
    		//登录
    		HtmlInput ln = htmlPage.getHtmlElementById("username");
    		HtmlInput pwd = htmlPage.getHtmlElementById("password");
    		HtmlInput submit = htmlPage.getFirstByXPath("//form[@id='login_form']/ul/li[4]/input");
    		ln.setAttribute("value", "ceshi01");
    		pwd.setAttribute("value", "123456");
    		HtmlPage page2 = submit.click();
    		//登录完成,爬取iframe的url
    		HtmlPage page3 = webClient.getPage("http://localhost:8080/jeefh/home/home.jsp");
    		Document doc= Jsoup.parse(page3.asXml());
    		Element table = doc.getElementById("my_task_lisk");
    		Elements tds = table.select("td");
    		webClient.close();
    	}

    :getFirstByXPath方法的参数为XPath

    maven:

        <dependency>
          <groupId>net.sourceforge.htmlunit</groupId>
          <artifactId>htmlunit</artifactId>
          <version>2.23</version>
        </dependency>

    效果:

    三、HtmlUnit模拟登录引入iframe

    	public static void main(String[] args) throws IOException {
    		WebClient webClient = new WebClient(BrowserVersion.CHROME);//设置浏览器
    		webClient.getOptions().setCssEnabled(false);//设置css是否生效
    		webClient.getOptions().setJavaScriptEnabled(true);//设置js是否生效
                    webClient.getOptions().setThrowExceptionOnScriptError(false);//设置是否抛js异常
    		webClient.setAjaxController(new NicelyResynchronizingAjaxController());//设置ajax请求
    		webClient.getOptions().setTimeout(10000);
    		webClient.waitForBackgroundJavaScript(3000);
    		HtmlPage login = webClient.getPage("http://10.96.4.136:9300/p2pd/servlet/dispatch");//访问路径设置
    		//登录
    		HtmlInput ln = login.getElementByName("CAMUsername");
    		HtmlInput pwd = login.getElementByName("CAMPassword");
    		HtmlAnchor submit = login.getFirstByXPath("//a[@href='javascript:doSubmit()']");
    		ln.setAttribute("value", "f0000");
    		pwd.setAttribute("value", "123456");
    		submit.click();
    		System.out.println("登录成功。。");
    		HtmlPage index = webClient.getPage("http://10.96.4.136:9300/p2pd/servlet/dispatch?b_action=xts.run&m=portal/cc.xts&m_folder=iB3FE4EB598AC4ED894A69C6B28150532");
    		HtmlAnchor temp = index.getFirstByXPath("//table[@class='cctable']/tbody/tr[3]/td[5]/a");
    		HtmlPage data = temp.click();
    		System.out.println("页面跳转成功。。");
    		List<FrameWindow> window = data.getFrames();
    		HtmlPage iframe = (HtmlPage)window.get(0).getEnclosedPage();//getEnclosedPage方法有两个返回值不同,调用返回值为page的
    		System.out.println("IFrame加载成功。。");
    		String str = iframe.asXml();
    		Document doc = Jsoup.parse(str);
    		Elements tables = doc.getElementsByClass("tb");
    		Element table = tables.first();
    		webClient.close();
    	}

    :1、getEnclosedPage方法有两个返回值不同,调用返回值为page的再强转,否则页面还是原来的;

           2、iframe有name属性的调用HtmlPage.getFrameByName("classFrame").getEnclosedPage();

           3、没name属性的调用HtmlPage.getFrames().get(0).getEnclosedPage();参数0是页面中出现的第1个iframe;

    展开全文
  • Spring中调用http的方式WebClient

    千次阅读 2019-01-22 16:23:47
    可以选用RestTemplate类,在Spring5以后,在Spring-webflux包中有一个更为合适的类型,叫做WebClient,能做到自己封装同步调用和异步调用,下面献上我自己的WebClient的配置和使用。 WebClient配置: @Test ...
  • 访问网络的时候,我使用了webclient,为了使webclient带cookies我重写了相应的函数 protected override WebRequest GetWebRequest(Uri address) { //hwr = (HttpWebRequest)base.GetWebRequest(new Uri(url));
  • WebClient, HttpClient, HttpWebRequest的比较

    千次阅读 2019-04-12 11:49:16
    最近因为要调用webAPI功能,所以开始对目前基于.NET的相关访问手段进行分析,主要有HttpWebRequest,WebClient和HttpClient三种手段。 HttpWebRequest 这是.NET创建者最初开发用于使用HTTP请求的标准类。使用...
  • HtmlUnit设置代理并解析IFrame页面

    千次阅读 2017-03-06 16:37:38
    1、需求:支持代理设置访问,并采集网页下iframe框架内的页面内容 2、参考代码如下: package com; import java.io.FileInputStream; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi....
  • import com.gargoylesoftware.htmlunit.BrowserVersion; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.*; import org.junit.Assert; import org.junit.Test; impor
  • WCF 的 WebGet 方式

    万次阅读 2011-07-18 09:47:32
    .NET 3.5以后,WCF中提供了WebGet的方式,允许通过url的形式进行Web 服务的访问。在以前的代码中,写过多次类似的例子,但总是忘记如何配置,现在将设置步骤记录如下:endpoint通讯协议设置成 webHttpBinding ...
  • 原因是:你采用了post方式发送请求,可是在url后面带了参数 ...jfk 若是你的url类似上面的格式,则用post请求就会报错, ...WebClient client = new WebClient(); String jsonResult = client.DownloadSt
  • //body是要传递的参数,格式"roleId=1&uid=2" //post的cotentType填写: //"application/x-www-form-urlencoded" //soap填写:"text/xml; charset=utf-8" public static string PostHttp(string url, string body, ...
  • htmlUnit使用

    万次阅读 2017-04-16 16:28:36
    htmlunit htmlUnit介绍: htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源实现。是一个没有界面的浏览器,运行速度...
  • webclient请求返回乱码

    千次阅读 2016-04-22 14:57:00
    官网正常 头信息 使用链接直接访问 webclient返回页面p.getWebResponse().getContentAsString() 打印出来乱码 解决办法: p.getWebResponse().getContentAsString("utf-8") ...设置编码
  • Vert.x(vertx)发送 HTTP/HTTPS请求

    千次阅读 2019-02-25 09:22:34
    应用场景 在应用系统中,经常会有类似于获取天气、发送短信、处理图像、支付等需求,这些需求实现都非常复杂,或者受到监管的限制,不是任何一个公司都可以做到的。但有些应用为了提升用户的体验,需要用到这些功能...
  • python 用socket向网页发送 GET 请求

    千次阅读 2018-06-23 16:56:40
    send request 'GET' to www.baidu.com and save the receved content to a txt file ''' from socket import * import sys header_send = b'GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: c...
  • 而C#中封装好的WebClient可以在某些要求不算搞的场景实现Http的Post和Get。具体请见代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sy
  • 这里用的是webflux,所以我们使用webClient来进行服务之间的调用,用的reactive的风格。 除了刚才的service-1,我们再复制一个client-1出来,搭建过程其实是一模一样的,只是记得要修改默认端口号,这里就不再多说...
  • 今年5月接触的这两个框架
  • 关于WebClient超时问题

    万次阅读 2017-10-26 16:51:33
    如果使用默认超时,将会大大影响推送效率,经检索资料,发现WebClient类没有超时设置。 这里查到有两种方案解决。 方案1  重写WebClient类,增加超时设置,实现起来还是比较简单 public class
1 2 3 4 5 ... 20
收藏数 3,986
精华内容 1,594
关键字:

webclient 设置get访问