精讲RestTemplate第10篇-使用代理作为跳板发送请求
本文是精讲RestTemplate第10篇,前篇的blog访问地址如下:
- 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用
- 精讲RestTemplate第2篇-多种底层HTTP客户端类库的切换
- 精讲RestTemplate第3篇-GET请求使用方法详解
- 精讲RestTemplate第4篇-POST请求方法使用详解
- 精讲RestTemplate第5篇-DELETE、PUT等请求方法使用详解
- 精讲RestTemplate第6篇-文件上传下载与大文件流式下载
- 精讲RestTemplate第7篇-自定义请求失败异常处理
- 精讲RestTemplate第8篇-请求失败自动重试机制
- 精讲RestTemplate第9篇-如何通过HTTP Basic Auth认证
本节我们要为大家介绍一下,如何在使用RestTemplate发送请求的时候使用代理Proxy。至于为什么要使用代理,给大家举一个简单的例子:一些做过爬虫的同学可能都知道,当爬虫高频的多次访问一个网站数据,可能导致请求客户端Ip被封锁的可能。很多情况下,做爬虫的企业就维护一个代理IP池,每发送一次请求,就更换一次IP。 代理Proxy作为跳板成为服务的直接访问者,代理使用者(真正的客户端)是间接访问服务。这样在服务端看来,每次请求是代理发出的,从代理IP池中一直更换代理发送请求,这样能够降低IP封锁的可能。
我们本节就来为大家介绍,作为一个代理使用者,该如何使用RestTemplate发送请求的时候使用代理Proxy。
一、搭建一个代理服务器
笔者只从知识的层面去讲解使用方法,所以不做蝇营狗苟的勾当。代理服务器还是由我自己来搭建用来测试,在我的一个CentOS服务器上安装tinyproxy,tinyproxy可以提供代理服务。
# 安装tinyproxy 命令
sudo yum install tinyproxy -y
编辑tinyproxy的配置文件vim /etc/tinyproxy/tinyproxy.conf
。为该代理配置允许访问的使用者客户端ip,也就是我家的ip,所以这个代理服务只能我用,其他人用不了。
# 代理服务端口
Port 1080
# 允许哪个客户端使用该代理程序?
Allow xxx.xxx.xxx.xxx
启动tinyproxy提供代理服务,最好检查一下防火墙是否开放了1080端口。
systemctl start tinyproxy.service
二、用于测试的服务端
- 我们这次要访问的服务端是:
http://www.httpbin.org
, 这个网站是提供在线的HTTP访问服务的网站。我们可以用它进行测试。 -
http://www.httpbin.org/ip
是我们本次要访问的服务,响应结果是访问者的IP。
我在家里使用电脑访问这个服务的时候结果如下:
上图没有使用代理,所以返回的是我家的ip。如果我使用代理访问,返回结果应该是proxy代理服务器的ip地址。
三、代理使用者RestTemplate
我的第一小节中的代理服务器的ip是88.99.10.251,tinyproxy代理服务端口1080。下文代码通过SimpleClientHttpRequestFactory设置访问代理
@SpringBootTest
class ProxyTests {
@Resource
private RestTemplate restTemplate;
@Test
void testProxyIp() {
String url = "http://www.httpbin.org/ip";
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setProxy(
new Proxy(
Proxy.Type.HTTP,
new InetSocketAddress("88.99.10.251", 1080) //设置代理服务
)
);
restTemplate.setRequestFactory(requestFactory);
//发送请求
String result = restTemplate.getForObject(url, String.class);
System.out.println(result); //打印响应结果
}
}
代理类型可以是HTTP也可以是SOCKS。下图是 "http://www.httpbin.org/ip" 的请求响应结果,返回的是代理服务器的ip,而不是我家里的ip。说明我们为RestTemplate 设置的代理生效了。
喜欢 (0)or分享 (0)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 《内网安全攻防》学习笔记,第二章-域内信息收集
- 献给每一位母亲
- JUC学习之生产者和消费者
- 在 WSL 2 中基于 Docker 编排 LNMP 运行环境
- PHP 魔术方法、序列化与对象复制
- PHP 静态属性和静态方法
- 通过 Trait 水平扩展 PHP 类功能
- 通过对象组合水平扩展 PHP 类功能
- DO,DTO,VO,POJO 你知道吗?
- Python 爬虫进阶必备 | AES-CBC 的 Pyhon 实现要怎么写?给代码就完事了
- Babel:下一代Javascript语法编译器
- 如何定位及优化SQL语句的性能问题
- Java线程安全如何进行原子操作,一致性的最佳实践
- 冒泡排序
- 现有CDP-DC集群启用Auto-TLS