python如何获取请求的url_听说你在学习:如何通过代码请求URL地址

最近比较忙碌,都没有时间更新公众号文章,表示比较惭愧。最近翻看了一下自己的博客,发现这篇文章的内容还是挺实用,所以,想分享给大家,欢迎阅读。在后续,我会从一个范围的角度进行编写一系列文章,便于各位深层次的理解,而不是片面的了解知识点,并且会有规律性的更新文章,期望你的持续关注。

另外,我也官宣一下自己的花名为【小蜗牛】,愿我们都能像小蜗牛一样,一步一个脚印,坚持不懈,达到我们的梦想彼岸。

f6eafb4004102350a5a05233ee05c3e3.png

情景引入

旁白:

今天兴致极好,开开心心的与小白玩着“网页小游戏”
1.小白

真开心呀,好久没有玩这些网页游戏了呢。
2.小蜗牛

确实,工作一来,哪有这样的闲情逸致。
1.小白

不过,你看,咱们玩的游戏都是通过网页链接请求,然后返回给咱们这么多对应的响应内容,它这里感觉好神奇。2.小蜗牛

当然,它里面涉及到的内容还是非常多,可不是一下就能完整掌握的,你这思考问题的能力大大加强了嘛!
1.小白

这可不嘛,学习到老才行呢。不过,我经常听到同事说,快给我一个接口地址,我要向你发出请求获取信息啦,这里面到底是怎么实现的,一直都没有机会去请教他们。2.小蜗牛

虚心求教,这是非常值得的,不要害怕,不懂就要问,这才是应该有的态度。既然,这样的话,那我就给你科普科普。这不,正好咱们也可以“中场休息”一会,再继续游戏呢。
1.小白

好呀好呀!学习,游戏两不误,岂不是人生一大快事!2.小蜗牛

小白,你已经长大了!!

引言

当我们输入一个URL然后回车,页面会显示出对应的功能信息,那么它这个过程到底是如何的呢?其实,这里面涉及到的内容会非常多,比如缓存,地址解析,http协议,网络请求,OSI模型,服务器数据组装,页面渲染等等。这里,就不会说得那么详细(PS:但是这个链路过程,建议各位看官可以好好的琢磨琢磨,分析分析),本文主要是针对,如果对一个已知URL发出请求并获取到其实时的响应信息;

实际场景

我想,在实际开发中经常会碰到这样的事情,就是:需要Http请求其他同事开发的接口,而获取对应需要的内容,比如下载一个URL的文件或者获取数据列表信息等等以及调用第三方公共接口信息。那么,必不可少的就是通过代码去发出一个http的请求。那么,具体如何操作呢?客观,慢慢往下看!

操作方法

现在的方法有很多,且不限于本文说到的几种方式哦!本文主要采取循序渐进的方式,并没有说哪一种方法就是最好的,具体问题具体分析,要以一种开放的心态看待这个问题。

HttpUrlConnection

请求步骤

PS:该方式是最原始的方式,所以值得学习其内部执行流程;

package com.hnu.scw.utils;import java.io.*;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLEncoder;import java.util.Map;/** * @ Author     :scw * @ Date       :Created in 上午 10:34 2020/5/24 0024 * @ Description:请求URL的post方法工具类 * @ Modified By: * @Version: $version$ */public class HttpPostUtils {    /**     * 请求URL的post请求     * @param url  请求url地址     * @param parameters 请求参数     * @return 响应结果字符串     * @throws Exception 异常信息     */    public static String doRequestPostMethod(String url, Map<String, Object> parameters) throws Exception {        // 将参数转为String(PS:因为如果URL需要参数的话,那么都是采取字符串字节的形式)        String params = convertRequestParameter(parameters);        URL restURL = new URL(url);        // 请求失败的次数(PS:便于减少由于某次的网络抖动而影响请求)        int errorNumber = 0;        while( errorNumber < 3 ) {            try {                HttpURLConnection conn = (HttpURLConnection) restURL.openConnection();                // 设置请求超时时间(PS:可以不设置)                conn.setConnectTimeout(5000);                conn.setReadTimeout(5000);                // 请求方式(PS:这里采取POST请求,如果需要GET请求,则为GET)                conn.setRequestMethod("POST");                // 设置请求的数据格式为JSON                conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8");                conn.setRequestProperty("Connection", "Keep-Alive");                // 是否从httpUrlConnection读入,默认情况下是true                conn.setDoOutput(true);                // 是否允许用户交互,假设为true,则允许用户交互的上下文中对此URL进行检查(比如对话框验证交互)。                conn.setAllowUserInteraction(false);                // 获取输出流(PS:这里方式很多,这里提供几种)                // 方式一                PrintStream ps = new PrintStream(conn.getOutputStream());                ps.print(params);                ps.close();                // 方式二               /* DataOutputStream out = new DataOutputStream(conn.getOutputStream());                out.write(params.getBytes("UTF-8"));                out.flush();                out.close();*/                // 建立连接                conn.connect();                // 获取响应输入流                BufferedReader bReader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));                String line;                String resultStr = "";                // 拼接响应内容                while (null != (line = bReader.readLine())) {                    resultStr += line;                }                bReader.close();                // 返回相应结果(PS:为字符串格式)                return resultStr;            } catch (Exception e) {                // 错误次数+1                errorNumber++;            }        }        throw new Exception("当前网络异常存在抖动,请稍后再试");    }    /**     * 将map形式的参数转为字符串形式     * @param parameters 请求参数     * @return 请求参数字符串     */    private static String convertRequestParameter(Map<String, Object> parameters) throws UnsupportedEncodingException {        StringBuilder sb = new StringBuilder();        // 遍历接参数内容        for (Map.Entry<String,Object> param : parameters.entrySet()) {            if (sb.length() != 0) {                sb.append('&');            }            // 防止中文乱码            sb.append(URLEncoder.encode(param.getKey(), "UTF-8"));            sb.append('=');            sb.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));        }        return sb.toString();    }}

OkHttpClient

添加依赖

<dependency>            <groupId>com.squareup.okhttp3groupId>            <artifactId>okhttpartifactId>            <version>3.8.0version>        dependency>

请求步骤(GET和POST方式)

package com.hnu.scw.utils;import okhttp3.*;import javax.net.ssl.HostnameVerifier;import javax.net.ssl.SSLSession;import java.io.*;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLEncoder;import java.util.Map;/** * @ Author     :scw * @ Date       :Created in 上午 10:34 2020/5/24 0024 * @ Description:请求URL的post方法工具类 * @ Modified By: * @Version: $version$ */public class HttpPostUtils {        /**     * 执行 POST 请求     * @param url  请求的URL     * @return 响应结果     */    public String doRequestPostByOkHttpClient(String url) {        // ssl的认证重写(PS:用于防止请求URL时有些系统会进行安全验证而导致请求失败)        OkHttpClient okHttpClient = new OkHttpClient.Builder().hostnameVerifier(                new HostnameVerifier() {                    @Override                    public boolean verify(String s, SSLSession sslSession) {                        return true;                    }                }        ).build();        // 如果是JDK1.8以上的,那么可以采取lambda重写匿名函数的方式       /* OkHttpClient okHttpClient = new OkHttpClient.Builder().hostnameVerifier(                (s, sslSession) ->{                    return true;                }        ).build();*/        // 设置请求的参数信息        RequestBody requestBody = new FormBody.Builder()                .add("key1", "test")                .add("key2", "hello")                .build();        // 封装请求头信息        Request request = new Request.Builder()                .url(url)                .post(requestBody)                .addHeader("Cookie", "JSESSIONID=299571E0E40DA6E9962E41B87A669BBB")                .addHeader("content-type", "application/json")                .addHeader("cache-control", "no-cache")                .build();        Call call = okHttpClient.newCall(request);        try {            Response response = call.execute();            // 返回相应结果            return response.body().string();        } catch (IOException e) {            e.printStackTrace();        }        return null;    }}

SpingRestTemplate

请求步骤(GET和POST方式)

方式一

package com.hnu.scw.utils;import okhttp3.*;import org.apache.poi.ss.formula.functions.T;import org.springframework.http.HttpEntity;import org.springframework.http.HttpHeaders;import org.springframework.http.MediaType;import org.springframework.http.ResponseEntity;import org.springframework.web.client.RestTemplate;import javax.net.ssl.HostnameVerifier;import javax.net.ssl.SSLSession;import java.io.*;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLEncoder;import java.util.Map;/** * @ Author     :scw * @ Date       :Created in 上午 10:34 2020/5/24 0024 * @ Description:请求URL的post方法工具类 * @ Modified By: * @Version: $version$ */public class HttpPostUtils {        /**     * 执行 POST 请求 通过Spring 的restTemplate方式     * @param url 请求URL     * @param parameter 请求参数     * @return 响应结果字符串     */    public String doRequestPostByRestTemplate(String url, Object parameter) {        RestTemplate template = new RestTemplate();        HttpHeaders headers = new HttpHeaders();        // 设置请求的格式为:json        MediaType type = MediaType.parseMediaType("application/json;charset=UTF-8");        headers.setContentType(type);        HttpEntity entity = new HttpEntity(parameter,headers);        // POST方式,如果要用GET,则为getForObject即可        String result = template.postForObject(url, entity, String.class);        return result;    }    /**     * 执行 POST 请求 通过Spring 的restTemplate方式二     * @param url  请求URL     * @param parameter 请求参数(PS:一般为java实体)     * @param backDto 相应的结果实体     * @return 响应结果实体     */    public  T doRequestPostByRestTemplate(String url, Object parameter, Class backDto) {        RestTemplate template = new RestTemplate();        HttpHeaders headers = new HttpHeaders();        // 设置请求的格式为:json        MediaType type = MediaType.parseMediaType("application/json;charset=UTF-8");        headers.setContentType(type);        HttpEntity entity = new HttpEntity(parameter,headers);        // POST方式,如果要用GET,则为getForObject即可        String result = template.postForObject(url, entity, String.class);        // 将json字符串转为实体        return JSON.parseObject(result, backDto);    }}

方式二:

package com.hnu.scw.utils;import okhttp3.*;import org.apache.poi.ss.formula.functions.T;import org.springframework.http.HttpEntity;import org.springframework.http.HttpHeaders;import org.springframework.http.MediaType;import org.springframework.http.ResponseEntity;import org.springframework.web.client.RestTemplate;import javax.net.ssl.HostnameVerifier;import javax.net.ssl.SSLSession;import java.io.*;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLEncoder;import java.util.Map;/** * @ Author     :scw * @ Date       :Created in 上午 10:34 2020/5/24 0024 * @ Description:请求URL的post方法工具类 * @ Modified By: * @Version: $version$ */public class HttpPostUtils {        /**     * 执行 POST 请求 通过Spring 的restTemplate方式的方式二     * @param url 请求URL     * @param parameter 请求参数     * @return 响应结果实体类型     */    public <T> T doRequestPostByRestTemplateEntity(String url, Object parameter, Class<T> backDto) {        RestTemplate template = new RestTemplate();        HttpHeaders headers = new HttpHeaders();        // 设置请求的格式为:json        MediaType type = MediaType.parseMediaType("application/json;charset=UTF-8");        headers.setContentType(type);        HttpEntity entity = new HttpEntity(parameter,headers);        // POST方式,如果要用GET,则为getForEntity即可        ResponseEntity<T> tResponseEntity = template.postForEntity(url, entity, backDto);        return tResponseEntity.getBody();    }}

81e2b386ef2c4b5a8c43ba2e28c6b458.png

总结

  1. 本文讲述的方式各自有各自的应用场景,并不存在哪一种就是最好的形式(PS:当然不仅仅只有这些方式,比如还有apache的httpClient,CloseableHttpClient以及springCloud中常见的Fegin)。

  2. 实际工作中发出http的请求是相对的多,对于其内部的执行流程和实现原理要去掌握(PS:网络协议+socket+netty都是需要掌握)。

  3. 针对常用的场景和技术要学会去总结,分析各自的利弊,而不要只会用而不明白其内部。

  4. 通过阅读本文内容之后,建议将“输入一个URL地址,然后回车敲击显示结果”,这个链路的整个过程都去学习和掌握,你会发现更多的美哦!

小彩蛋:如果觉得公众号文章内容看起来显得比较多,那么还可以在我的博客中进行查阅哦,还有更多的惊喜等着你的光顾。

https://blog.csdn.net/Cs_hnu_scw/article/details/106311101

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在sql中将表建在别的构件中用什么语句_SQL实战

学习主题&#xff1a;SQL学习目标&#xff1a;1 掌握子查询1. 什么是子查询(1) 什么是子查询&#xff1f;答&#xff1a;当一个查询是另一个查询的条件时&#xff0c;称之为子查询。简而言之&#xff1a;嵌套查询(2) 子查询执行的顺序是什么&#xff1f;答&#xff1a;先进行内…

数据结构入门之链表(C语言实现)

这篇文章主要是根据《数据结构与算法分析--C语言描述》一书的链表章节内容所写&#xff0c;该书作者给出了链表ADT的一些方法&#xff0c;但是并没有给出所有方法的实现。在学习的过程中将练习的代码记录在文章中&#xff0c;并添加了一些在测试中需要的函数&#xff0c;因此可…

centos radius mysql_centos6.5下安装freeradius2.2.9+mysql

平台centos6.5 x86_641&#xff0c;安装源并更新rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpmyum update -y2&#xff0c;安装相关库yum -y install wget expat-devel gcc make gmp-devel gmp pkgconfig perl libpcap gcc-c logrotate…

二手书城开发步骤

请点击进入 1、二手书城设计 2、搭建页面框架 3、构建bass服务及model 4、淘书页详细 5、购物车页详细 6、订单页详细 7、我的页详细 8、发布页详细转载于:https://www.cnblogs.com/xiaoxiaohabi/p/6789349.html

mongoose mysql_mongoose入门

mongoose入门MongoDB是一个开源的NoSQL数据库&#xff0c;相比MySQL那样的关系型数据库&#xff0c;它更显得轻巧、灵活&#xff0c;非常适合在数据规模很大、事务性不强的场合下使用。同时它也是一个对象数据库&#xff0c;没有表、行等概念&#xff0c;也没有固定的模式和结构…

php 验证码需开启gd2

转载于:https://www.cnblogs.com/zhangj391/p/6794555.html

pcm 降采样_Android_android downsample降低音频采样频率代码,使用Android AudioRecord 录制PCM文 - phpStudy...

android downsample降低音频采样频率代码使用Android AudioRecord 录制PCM文件&#xff0c;android SDK保证在所有设备上都支持的采样频率只有44100HZ&#xff0c;所以如果想得到其他采样频率的PCM数据&#xff0c;有几种方式&#xff1a;1.在设备上尝试可用的采样频率&#xf…

C++中没有定义类的引用。

在有时候由于类太大。须要在类在后面定义&#xff1b; 比如&#xff1a; class Y{void f(X); }; class X{ //一些成员数据和函数};//error由于c要求不论什么一个变量在引用之前必须声明。。在上述定义中我们能够调换两者的顺序来实现。 可是假设形成了循环&#xff1f; class X…

python中不能使用下标运算的有哪些_Python中最常见的10个问题(列表)

列表是Python中使用最多的一种数据结果&#xff0c;如何高效操作列表是提高代码运行效率的关键&#xff0c;这篇文章列出了10个常用的列表操作&#xff0c;希望对你有帮助。注意&#xff1a;很多人学Python过程中会遇到各种烦恼问题&#xff0c;没有人帮答疑。为此小编建了个Py…

Spring:与Redis的集成

一个月没写过博客了&#xff0c;一直想记录一下之前学习的Redis的有关知识&#xff0c;但是因为四月太过于慵懒和忙碌&#xff0c;所以一直没有什么机会&#xff0c;今天就来讲讲&#xff0c;如何使用Spring当中的Spring-data-redis去与Redis这个Nosql数据库集成吧。 首先先简单…

python中如何将字典直接变成二维数组_python基础知识(列表、字典、二维数组)...

记得改参数&#xff01;&#xff01;&#xff01;(1)简述列表(list)结构的特点。List(列表)List的元素以线性方式存储&#xff0c;可以存放重复对象&#xff0c;List主要有以下两个实现类&#xff1a;ArrayList : 长度可变的数组&#xff0c;可以对元素进行随机的访问&#xff…

内置对象和自定义对象的原型链

内置对象的原型链 新增属性 Object.prototype.mytest function() {alert("123");}var o new Object();o.mytest();重写属性 Object.prototype.toString function(){alert("破话之王");}o.toString();转载于:https://www.cnblogs.com/Abner5/p/6798630.h…

mysql将不同行数结果合并成多列_将多行合并到mysql中的一行和多列

我正在MYSQL工作,需要将用户数据提取到一个视图中.我将使用电子邮件客户端中的数据,因此我无法在应用程序层中执行此操作.问题是用户的每个数据字段都包含在单独的行中(这是Wordpress如何设置数据结构).例如,wp_usermeta为每个用户提供了多行数据,如下所示&#xff1a;user_id …

一些JavaScript基本函数

1.document.write(”");为 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4.一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document) 5.得到表单中元素的名称和值:document.getElementById(”表单…

mysql动态代理_超全MyBatis动态代理详解(绝对干货)

前言假如有人问你这么几个问题&#xff0c;看能不能答上来Mybatis Mapper 接口没有实现类&#xff0c;怎么实现的动态代理JDK 动态代理为什么不能对类进行代理(充话费送的问题)抽象类可不可以进行 JDK 动态代理(附加问题)答不上来的铁汁&#xff0c;证明 Proxy、Mybatis 源码还…

Linux学习之SAMBA共享(无密码)

一、服务器配置 安装&#xff1a;yum install -y samba 更改要共享的path权限&#xff1a;chmod 777 /mnt/samba/ 先备份smb.conf配置文件&#xff1a;cp /etc/samba/smb.conf /etc/samba/smb.conf.bak 更改配置&#xff1a;vim /etc/samba/smb.conf security sha…

getline()函数

本文转自&#xff1a;http://blog.sina.com.cn/s/blog_60263c1c0101ck25.html学习C的同学可能都会遇到一个getline()函数&#xff0c;譬如在Cpremer中&#xff0c;标准string类型第二小节就是“用getline读取整行文本”。书上给的程序如下&#xff1a;int main(){string line:w…

廖雪峰讲python高阶函数求导公式_高阶函数 - 廖雪峰 Python 2.7 中文教程

高阶函数英文叫Higher-order function。什么是高阶函数&#xff1f;我们以实际代码为例子&#xff0c;一步一步深入概念。变量可以指向函数以Python内置的求绝对值的函数abs()为例&#xff0c;调用该函数用以下代码&#xff1a;>>> abs(-10)10但是&#xff0c;如果只写…

.ai域名注册已经极具投资价值进入火爆期

最近G.ai以六位数的天价被国内域名收藏家收入囊中&#xff0c;间接说明了.ai域名的价值不断攀升&#xff0c;自从2016年AlphaGo胜利以来&#xff0c;人工智能几乎成为人人谈资&#xff0c;而由于.com域名被挖掘待尽&#xff0c;一些聪明的人工智能创业者&#xff0c;避开了com域…

软件工程概论---典型用户和用户场景描述

二手书交易平台典型用户——在校学生 名字&#xff1a;小张 年龄&#xff1a;19 收入&#xff1a;学生 代表的用户在市场上的比例和重要性&#xff1a;主要代表广大的大学生&#xff0c;大学生应该是我们产品的最主要用户。 使用这个软件的典型场景&#xff1a;大学生苦于自己的…