问题描述:
使用HttpClient进行http请求,每次请求随机使用一个target host进行请求。

发http请求的时候,一般会配置数据源,设置ClientPNames.DEFAULT_HOST,这样在请求的时候目标机器host和端口就是配置的ClientPNames.DEFAULT_HOST。但是不能每次请求ClientPNames.DEFAULT_HOST,因为一个httpclient就对应一个ClientPNames.DEFAULT_HOST,就无法针对一次request进行目标host的修改。

例如:
HttpGet httpGet = new HttpGet(url);
在进行请求时,httpGet作为参数执行execute,此时url是相对路径,httpclient会将defaulthost+uri拼接为完整的请求地址进行请求。

看HttpClient的源代码可以发现URI是个线索,在execute方法中会判断URI中设置的是否是绝对路径还是相对路径,如果是相对路径时httpclient会将defaulthost+uri拼接为完整的请求地址。如果URI中设置了scheme并且URI配置了host就会用URI完整的绝对路径作为请求地址。判断逻辑如下

public final HttpResponse execute(HttpUriRequest request,HttpContext context)throws IOException, ClientProtocolException {if (request == null) {throw new IllegalArgumentException("Request must not be null.");}return execute(determineTarget(request), request, context);
}private static HttpHost determineTarget(HttpUriRequest request) throws ClientProtocolException {// A null target may be acceptable if there is a default target.// Otherwise, the null target is detected in the director.HttpHost target = null;URI requestURI = request.getURI();if (requestURI.isAbsolute()) {target = URIUtils.extractHost(requestURI);if (target == null) {throw new ClientProtocolException("URI does not specify a valid host name: " + requestURI);}}return target;
}

分析完就找到了方法解决问题了,在请求时设置URI即可,要注意的是build URI的时候要配置scheme参数才能生效。

HttpClient发送请求时动态替换目标ip相关推荐

  1. postman发送object_.NetCore HttpClient发送请求的时候为什么自动带上了一个RequestId头部...

    奇怪的问题 最近在公司有个系统需要调用第三方的一个webservice.本来调用一个下很简单的事情,使用HttpClient构造一个SOAP请求发送出去拿到XML解析就是了. 可奇怪的是我们的请求在运 ...

  2. .NetCore HttpClient发送请求的时候为什么自动带上了一个RequestId头部?

    奇怪的问题 最近在公司有个系统需要调用第三方的一个webservice.本来调用一个下很简单的事情,使用HttpClient构造一个SOAP请求发送出去拿到XML解析就是了.可奇怪的是我们的请求在运行 ...

  3. HttpClient发送请求

    HttpClient发送请求 前言:前段时间接到一个需求,要求系统中实现一个可以上传语音文件的功能,然后将文件和需要的参数发送到电信的接口上: 开始说起来感觉很简单,但是就真的被折磨了好几天,主要还是 ...

  4. maven 打包时动态替换properties资源文件中的配置值

    pom build节点下面添加resource配置: [html] view plaincopy <resources> <resource> <directory> ...

  5. VS2017登陆失败:我们无法刷新此账户的凭证、我们无法添加此账户发送请求时出错、评估期已结束,请登录以解除产品锁定

    一.问题: 点击登录后会显示如下窗口: [忘了截图,图片截于:(35条消息) Visual Studio 2017无法登录问题解决_kellyjucy的博客-CSDN博客_vs2017无法登陆] 二. ...

  6. 使用 IE 或Chrome等浏览器,通过网络抓包的形式,查看发送请求时的网络

    要求: 使用 IE 或Chrome等浏览器,通过网络抓包的形式,查看发送请求时的网络 实现步骤: 1.打开 IE 浏览器,选择"开发者工具",切换到"网络"标签 ...

  7. 通过httpclient发送请求的几种方式,发送文件、参数、json对象

    使用工具:idea 框架:gradle.springboot 实现目标:使用 httpclient 发送文件/参数/json对象 method:post 主要用到的jar包: compile grou ...

  8. ios 发送请求时按home_iPhone 是否能够升级至指定的 iOS 系统版本?

    对于 iPhone 用户来说,可能会有喜欢的特定 iOS 版本,例如经常有用户希望能回退到 iOS 12 或更早的系统.但比较遗憾的是,对于苹果官方已经关闭验证的系统版本,iPhone 5s 以及以上 ...

  9. 前后端分离时ajax发送请求时后端能接送,但是前端的response为空时

    困扰了一天的问题,使用ajax向后端发送请求,后端成功接收并且处理,但是返回前端时在前端调用response时发现后端返回的数据为空 . success:function (response) {if ...

  10. Java利用HttpClient发送请求生成微信支付二维码、查询支付状态

    一.HttpClient工具类 import org.apache.http.Consts; import org.apache.http.HttpEntity; import org.apache. ...

最新文章

  1. [03] 处理注解:反射
  2. centos 6.8 搭建svn服务器
  3. Web开发人员有用的代码比较工具
  4. linux在双系统中消失了,双系统重新安装windows后,ubuntu选项消失
  5. 【JS】call,apply,bind
  6. Codeforces Round #198 (Div. 2)A,B题解
  7. 常用文件格式转换大全: PDF转Word,WORD转PDF转换器,DOCX转DOC转换
  8. 用linux运行vasp,科学网—VASP使用 - 李继存的博文
  9. 王道 计算机网络试题讲解_王道考研系列--计算机网络
  10. win10通过ping命令来检测网速
  11. 【Python】Python中将字符串中的大写字母转换为小写字母,同时将小写字母转换为大写字母
  12. bzoj 4453 cys就是要拿英魂! —— 后缀数组+单调栈+set
  13. 【红外技术】红外焦平面阵列非均匀性校正
  14. nRF5340开发指南目录汇总
  15. Qt 编程 keySight 34401A 万用表(串口232编程)
  16. Dogfight :从无人机视频中检测无人机
  17. 前端开发——Ionic 3.0【爱创课堂专业前端培训】
  18. c语言 派生,继承和派生
  19. Python图像库PIL的类Image的paste写法
  20. 我国第一部纯国产超级计算机,纯国产超级计算机获得世界冠军

热门文章

  1. Lucas–Kanade(LK)光流算法详解
  2. 爬虫实现自动登陆抽屉网,实现对文章点赞,收藏,评论
  3. 实战案例:抽屉自动点赞与爬取汽车之家新闻
  4. 资金账户、证券账户及银行账户
  5. 简明 s3cmd 安装与使用手册
  6. 工业互联网体系架构、类型及应用
  7. ckfinder 配置 php,GitHub - itxq/ckfinder: CkFinder3.5.1 for PHP 优化版 (添加又拍云存储)...
  8. unity材质球复制
  9. 13年android手机top,2013年安卓ROOT工具大盘点(一键ROOT工具Top10)
  10. 服务器数据恢复成功案例(磁盘阵列恢复)