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

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

情景引入

旁白:

今天兴致极好,开开心心的与小白玩着“网页小游戏”
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();    }}

总结

  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

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

  1. python爬取百度新闻所有的新闻的前1页 标题和URL地址

    这是我自己写的一个爬取百度新闻的一个代码,欢迎大家多来讨论,谢谢!(自己已经测试可以使用,在文章最后见效果图) ''' re模板:2.2.1 requests模板:2.18.4 bs4模板:4.6.0 ...

  2. iOS开发中,通过URL地址获取网络上的图片

    在iOS开发中,我们有时会通过图片的URL地址来获取网上的图片,下面是一个方法实现: /** 通过URL地址从网上获取图片 */ -(UIImage *) getImageFromURL:(NSStr ...

  3. ajaxsetup获取ajax的url_$.ajaxSetup在ajax请求中的使用

    转载:https://blog.csdn.net/beitian_123/article/details/100601872 1. 背景 在工作中常用到ajax请求进行前后台交互,有时候一个页面中多处 ...

  4. Python实战案例,requests模块,Python实现获取动态图表

    前言 利用Python实现获取动态图表,废话不多说~ 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: re模块: requests模块: urllib模块: pandas模 ...

  5. python爬取淘宝商品做数据挖掘_Python 3爬虫 数据清洗与可视化实战 Python数据抓取技术 python3网络爬虫教程书籍 运用Python工具获取电商平台页面数据挖掘书籍...

    A8 书    名:Python 3爬虫 数据清洗与可视化实战 作 译 者:零一,韩要宾,黄园园 出版时间:2018-03 千 字 数:200 版    次:01-01 页    数:212 开   ...

  6. python怎么读文件里的某一行-Python如何获取文件指定行的内容

    linecache, 可以用它方便地获取某一文件某一行的内容.而且它也被 traceback 模块用来获取相关源码信息来展示. 用法很简单: >>> import linecache ...

  7. python随机生成车牌_使用Python自动化获取全国每个城市的车牌代码

    最近有这样一需求,需要获取12123交管查询网站上的全国每个城市对应的城市id和车牌代码.最初的想法是直接用Python写个爬虫,遍历每个城市,然后用Xpath提取DOM节点数据就好了.然而在实际操作 ...

  8. 爬虫实战学习笔记_6 网络请求request模块:基本请求方式+设置请求头+获取cookies+模拟登陆+会话请求+验证请求+上传文件+超时异常

    1 requests requests是Python中实现HTTP请求的一种方式,requests是第三方模块,该模块在实现HTTP请求时要比urlib.urllib3模块简化很多,操作更加人性化. ...

  9. python实现的json数据以HTTP GET,POST,PUT,DELETE方式页面请求

    转自 http://blog.chinaunix.net/uid-26000296-id-4394470.html 一.JSON简介 JSON(JavaScript Object Notation) ...

最新文章

  1. 一些有用的Python问题
  2. 帝国cms7.5多终端刷新单条内容信息时不起作用的解决方法
  3. 寻宝天行服务器维护中,你好。我的电脑寻宝天行网站上不去,其他网址都可以上,都好几天了。要么就无访问,要么跳出个502什么的...
  4. python for loop循环程序语句_python-带for循环的格式化输出_for-loop_酷徒编程知识库...
  5. 执行git命令时提示秘钥权限太开放‘Permissions 0644 for ‘/Users/liuml/.ssh/id_rsa_tz‘ are too open.’
  6. Laravel核心解读--HTTP内核
  7. 2021:测试人员面试时都中过哪些套路?
  8. Android wm指令的用法笔记
  9. Azure ARM (16) 基于角色的访问控制 (Role Based Access Control, RBAC) - 使用默认的Role
  10. 消防信号二总线有没电压_消防的电源总线和二总线的区别,二总线是不是信号线......
  11. 前端和后端的英文_前端工程师和后端工程师
  12. 计算机二级考试Python编程试题解读:使用turtle库绘制三角形
  13. 拼图(九宫格,十六宫格)
  14. JetBrains当选JCP执行委员会委员
  15. 美女数码宝贝(天女兽、蔷薇兽、花仙兽、莉莉丝兽、维纳斯兽、仙女兽、人鱼兽、古代人鱼兽、丁香兽)
  16. 孙宇晨真的有道歉吗?逐句解读孙宇晨避重就轻的“致歉信”
  17. ECE8.1认证之路
  18. 在虚拟机上使用SoftRoCE部署SPDK NVMe-oF
  19. 《Non-contact Eye Gaze Tracking System by Mapping of Corneal Reflections》论文阅读
  20. gitlab下载慢问题-centos/ubuntu

热门文章

  1. ad域同步其他ldap账号_域渗透——普通用户权限获得DNS记录
  2. linux 移出权限,一起学习在 Ubuntu 上授予和移除 sudo 权限
  3. ajax 折叠,ASP.NET AJAX可折叠面板Accordion应用实例
  4. 符江职高计算机教什么,高县符江职高具体地址
  5. iOS里面MVC模式详解
  6. 3D物体识别的假设检验
  7. matlab rem和mod,Matlab的mod和rem
  8. python求最大值最小值_Python求可变参数的最大值最小值以及参数个数
  9. mysql主从数据库同步问题_聊聊MySQL主从数据库同步的那些事儿
  10. 练习ddt-file_data时,报错UnboundLocalError local variable ‘value‘ referenced before assignment