我们平常浏览各个网站时,不免有时候就需要填写一些信息,比如注册时,登录时,这些信息一般都是通过GET请求或者POST(敏感信息一般使用POST,数据隐藏,相对来说更安全)请求提交到后台,经过后台的一系列处理,再返回给前台结果,前台进行处理。


GET请求携带请求参数和请求头:

@Test
public void getParams() {// 获取连接客户端工具CloseableHttpClient httpClient = HttpClients.createDefault();String entityStr = null;CloseableHttpResponse response = null;try {/** 由于GET请求的参数都是拼装在URL地址后方,所以我们要构建一个URL,带参数*/URIBuilder uriBuilder = new URIBuilder("http://www.baidu.com");/** 第一种添加参数的形式 *//*uriBuilder.addParameter("name", "root");uriBuilder.addParameter("password", "123456");*//** 第二种添加参数的形式 */List<NameValuePair> list = new LinkedList<>();BasicNameValuePair param1 = new BasicNameValuePair("name", "root");BasicNameValuePair param2 = new BasicNameValuePair("password", "123456");list.add(param1);list.add(param2);uriBuilder.setParameters(list);// 根据带参数的URI对象构建GET请求对象HttpGet httpGet = new HttpGet(uriBuilder.build());/* * 添加请求头信息*/// 浏览器表示httpGet.addHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)");// 传输的类型httpGet.addHeader("Content-Type", "application/x-www-form-urlencoded");// 执行请求response = httpClient.execute(httpGet);// 获得响应的实体对象HttpEntity entity = response.getEntity();// 使用Apache提供的工具类进行转换成字符串entityStr = EntityUtils.toString(entity, "UTF-8");} catch (ClientProtocolException e) {System.err.println("Http协议出现问题");e.printStackTrace();} catch (ParseException e) {System.err.println("解析错误");e.printStackTrace();} catch (URISyntaxException e) {System.err.println("URI解析异常");e.printStackTrace();} catch (IOException e) {System.err.println("IO异常");e.printStackTrace();} finally {// 释放连接if (null != response) {try {response.close();httpClient.close();} catch (IOException e) {System.err.println("释放连接出错");e.printStackTrace();}}}// 打印响应内容System.out.println(entityStr);}

  因为GET请求的参数都是拼装到URL后面进行传输的,所以这地方不能直接添加参数,需要组装好一个带参数的URI传递到HttpGet的构造方法中,构造一个带参数的GET请求。构造带参数的URI使用URIBuilder类。

  上面添加请求参数的方法有两种,建议后者,后者操作更加灵活。

  • 打印结果:


POST请求携带请求参数和请求头:

@Test
public void postParams() {// 获取连接客户端工具CloseableHttpClient httpClient = HttpClients.createDefault();String entityStr = null;CloseableHttpResponse response = null;try {// 创建POST请求对象HttpPost httpPost = new HttpPost("http://www.baidu.com");/** 添加请求参数*/// 创建请求参数List<NameValuePair> list = new LinkedList<>();BasicNameValuePair param1 = new BasicNameValuePair("name", "root");BasicNameValuePair param2 = new BasicNameValuePair("password", "123456");list.add(param1);list.add(param2);// 使用URL实体转换工具UrlEncodedFormEntity entityParam = new UrlEncodedFormEntity(list, "UTF-8");httpPost.setEntity(entityParam);/* * 添加请求头信息*/// 浏览器表示httpPost.addHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)");// 传输的类型httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");// 执行请求response = httpClient.execute(httpPost);// 获得响应的实体对象HttpEntity entity = response.getEntity();// 使用Apache提供的工具类进行转换成字符串entityStr = EntityUtils.toString(entity, "UTF-8");// System.out.println(Arrays.toString(response.getAllHeaders()));} catch (ClientProtocolException e) {System.err.println("Http协议出现问题");e.printStackTrace();} catch (ParseException e) {System.err.println("解析错误");e.printStackTrace();} catch (IOException e) {System.err.println("IO异常");e.printStackTrace();} finally {// 释放连接if (null != response) {try {response.close();httpClient.close();} catch (IOException e) {System.err.println("释放连接出错");e.printStackTrace();}}}// 打印响应内容System.out.println(entityStr);
}
  • 打印结果:


  What?返回的为什么是个这???很显然,返回来的代码是302重定向

  GET和POST两种请求方式,GET方式请求无这种情况产生,说明HttpClient对GET进行了处理,会自动处理重定向的连接。而POST并没有做这种处理,所以要手动处理

  PS:这里有一个小注意事项,在POST请求参数转换成请求实体(Entity)时,注意编码格式问题:UrlEncodedFormEntity entityParam = new UrlEncodedFormEntity(list, "UTF-8");
  
  我们该怎么解决这种问题?首先我们要分析,既然是重定向,那么响应回来的信息中,头信息(hearder)中肯定会存在重定向需要使用到的的键值对(Location:"http://www.xxxx.com"),先获取所有的头信息进行打印查看。

......前省略// 执行请求response = httpClient.execute(httpPost);// 获得响应的实体对象HttpEntity entity = response.getEntity();// 使用Apache提供的工具类进行转换成字符串entityStr = EntityUtils.toString(entity, "UTF-8");/** 此处获取所有的响应头信息并进行打印 */System.out.println(Arrays.toString(response.getAllHeaders()));} catch (ClientProtocolException e) {System.err.println("Http协议出现问题");e.printStackTrace();
} catch (ParseException e) {......后省略
  • 打印结果

  这时我们只需要获取到Location的值,再对其进行再次访问即可

  其实这里隐含了一个问题,敲重点...这里我直接获取所有的响应信息的头信息并进行打印,其中是存在Location这个key的,这是因为在代码中具有以下代码所以才会有这个返回信息。

  • 浏览器标识请求头信息:
httpPost.addHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)");

如果没有上面的浏览器标识的话,有些网站是不会显示Location地址的。
httpPost.addHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)");

  • 打印结果:
    [Server: bfe/1.0.8.18, Date: Tue, 18 Jul 2017 06:28:09 GMT, Content-Type: text/html, Content-Length: 17931, Connection: Keep-Alive, ETag: “54d9748e-460b”]

  可以看到,其中并没有Location,这时候就需要加上httpPost.addHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)");

为GET和POST请求添加请求参数和请求头相关推荐

  1. android post请求添加公共参数_XHttp2 一个功能强悍的网络请求库

    XHttp2 一个功能强悍的网络请求库,使用RxJava2 + Retrofit2 + OKHttp组合进行封装.还不赶紧点击使用说明文档,体验一下吧! 项目地址 关于我 https://github ...

  2. Okhttp 拦截器 请求添加公共参数、公共Headers 方法

    retrofit 基于okhttp.使用retrofit /okhttp时候,这些都会wifi 直连的,不走系统的wifi设置,代理是抓不到包的.所以如果 想抓包那么抓网卡吧,打印请求或者添加公共参数 ...

  3. android post请求添加公共参数_Java实现通用的Get和Post请求组件

    开发中经常遇到发送一个远程请求并解析返回结果的情况,那可以在项目中写一个Get/Post的组件,以后遇到远程请求直接调用即可 实现步骤为: 1.创建一个URL(java.net.URL)对象 2.打开 ...

  4. requests模块发送带headers的Get请求和带参数的请求

    1.在PyCharm开发工具中新建try_params.py文件: 2.try_params.py文件中编写代码: import requests#设置请求Headers头部header = {&qu ...

  5. flutter网络dio框架公共请求参数、请求header使用总结

    题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精. [x1]点击查看提示 [x2]各种系列的教程 一个程序员的修炼日记 本文章将讲述 1.get请求中配置公共参数 2.post请求配置公 ...

  6. axios (get post请求、头部参数添加)傻瓜式入门axios

    傻瓜式入门,简单粗暴说用法 通过cdn引入js文件 <script src="https://unpkg.com/axios/dist/axios.min.js">&l ...

  7. nGrinder中快速编写groovy脚本03-在GET请求中发送参数

    在GET请求脚本中添加添加信息头.cookies和自定义参数,有两种方式: 一种是在UI界面添加后自动生成脚本,一种是直接在脚本中添加. 一.通过UI界面添加 通过 UI 设置:脚本 -> 新建 ...

  8. jqgrid和ajax的区别,理解jqGrid的添加方法和Ajax请求

    我有一个现有的项目,我需要维护,但是这是我第一次满足的jqGrid ...理解jqGrid的添加方法和Ajax请求 主要是,我有一个Product,即可以有多个Formule小号.每个Formule可 ...

  9. 前端对所有文件请求添加header_【前端面试必问】浏览器缓存原理?送你满分答案...

    (本文适合所1-3年的前端阅读) 原文链接: http://blog.poetries.top/2019/01/02/browser-cache/ 一.浏览器缓存基本认识 分为强缓存和协商缓存 浏览器 ...

最新文章

  1. 学计算机应用好还是汽车维修好,大学汽车运用与维修专业怎么样_学什么_前景好吗-520吉他网...
  2. win8如何卸载mysql5.0_Win8如何卸载Windows的服务?卸载Windows的服务的方法和步骤
  3. cropper基本用法
  4. K8s创建pod yaml文件详解
  5. 前腾讯AI Lab主任张潼加盟创新工场,出任港科大创新工场联合实验室主任
  6. java实现ftp连接、登陆、上传、下载、删除文件、获取目录、文件列表
  7. 阿里架构师的工作总结:Spring Cloud在架构演进中起到的作用
  8. 动画效果之 Canvas学习-globalCompositeOperation详解
  9. 临近毕业,查降重来了
  10. 苹果电脑入门:复制、粘贴、剪切文件
  11. android往mac投屏,安卓手机怎么投屏到Mac系统中?
  12. 全国省市区街道区域信息 API 接口
  13. legion--一款开源,易用,扩展性强的半自动化渗透测试工具
  14. vue中keep-alive、activated的探讨和使用
  15. 干货 | 使用京东云搭建视频直播网站
  16. 用python生成excel文件_python通过openpyxl生成Excel文件的方法
  17. c语言窄字符转换为宽字符,将窄字符串转换为宽字符串
  18. 【每天读一点英文】叶芝诗歌《当你老了》赏析——特别喜欢的一首诗,水木年华《一生有你》歌词来源
  19. 上海财经应用统计考python_上海财经大学应用统计专硕考研经验帖
  20. DFT 离散傅里叶变换

热门文章

  1. SSH远程连接服务(五)
  2. Centos7(Linux)下安装Oracle11g
  3. 公司小白熟悉苹果Mac常用简单操作
  4. linux搜索命令有哪些,linux 中的搜索命令
  5. 类名不是抽象的,并且未覆盖XX类中的抽象方法jjjj
  6. fabs ( )【C语言库函数源代码】
  7. American Crew(R) ACUMEN™闪亮登场
  8. [XMOVE自主设计的体感方案] 历代版本系统介绍(一)X-MOVE1.0
  9. 计算机采用的编码机制是什么,编码机制
  10. windows下气象grib/grib2数据转Tiff格式输出