java发送Http请求(获取响应cookie、重定向)

2023-05-16

1、正常的发送Http请求,获取返回值(json格式)

/**
*引入的相关包
*import org.apache.http.HttpEntity;
*import org.apache.http.client.methods.CloseableHttpResponse;
*import org.apache.http.client.methods.HttpPost;
*import org.apache.http.entity.StringEntity;
*import org.apache.http.impl.client.CloseableHttpClient;
*import org.apache.http.impl.client.HttpClients;
*import org.apache.http.message.BasicHeader;
*import org.apache.http.protocol.HTTP;
*import org.apache.http.util.EntityUtils;
*import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;
*import net.sf.json.JSONArray;
*import net.sf.json.JSONObject;
*/
String body = "";
//创建httpclient对象
CloseableHttpClient client = HttpClients.createDefault();
//创建post方式请求对象
HttpPost httpPost = new HttpPost(url);
//装填参数
// jsonObject 是需要封装的参数
StringEntity s = new StringEntity(jsonObject.toString(), "utf-8");
s.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"application/json"));
//设置参数到请求对象中
httpPost.setEntity(s);       
//设置header信息
//指定报文头【Content-type】、【User-Agent】
//httpPost.setHeader("Content-type", "application/x-www-form-urlencoded");
httpPost.setHeader("Content-type", "application/json");
httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
//执行请求操作,并拿到结果(同步阻塞)
CloseableHttpResponse response = client.execute(httpPost);
//获取结果实体
HttpEntity entity = response.getEntity();
if (entity != null) {
//按指定编码转换结果实体为String类型
body = EntityUtils.toString(entity, encoding);
}
EntityUtils.consume(entity);
//释放链接
response.close();
return body;

请求头中参数设置

  1. Accept:告诉服务器能够发送哪些媒体类型,Accept属性的值可以为一个或多个MIME类型的值(描述消息内容类型的因特网标准, 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据)
  2. Accept-Charset:告诉服务器能够发送哪些字符集(utf-8)
  3. Accept-Encoding:告诉服务器能够发送哪些编码方式(Accept-Encoding: gzip, deflate )
  4. Accept-Language:告诉服务器能够发送哪些语言(Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6 )
  5. Cookie:客户端用它向服务器传送cookie数据值
  6. User-Agent:将发起请求的应用程序的名称告知服务器;User-Agent会告诉网站服务器,访问者是通过什么工具来请求的,如果是爬虫请求,一般会拒绝,如果是用户浏览器,就会应答
User-Agent: Mozilla/5.0 (平台) 引擎版本 浏览器版本号  
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0
  1. Content-type:服务端根据请求头中的Content-Type字段来获取消息主体的编码方式,进而进行解析数据。
    Content-type常见的媒体格式类型如下:
text/html : HTML格式
text/plain :纯文本格式
text/xml : XML格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png:png图片格式

Content-type以application开头的媒体格式类型:

application/xhtml+xml :XHTML格式
application/xml : XML数据格式
application/atom+xml :Atom XML聚合格式
application/json : JSON数据格式
application/pdf :pdf格式
application/msword : Word文档格式
application/octet-stream : 二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded : 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

上传文件使用:

multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

HTTP Content-Type 对照表:
地址:http://tool.oschina.net/commons/

2、登录后获取返回cookie,同时解决登录后的重定向问题

// 获取cookie
String host = "http://localhost:8080";
String url = "/login?username=zhangsan&password=123456";
CookieStore store = new BasicCookieStore();
//创建httpclient对象
CloseableHttpClient client = HttpClients.custom().setDefaultCookieStore(store).build();
//创建post方式请求对象
HttpPost httpPost = new HttpPost(host + url);
String result = "";
//设置header信息
//指定报文头【Content-type】、【User-Agent】
httpPost.setHeader("Content-type", "application/x-www-form-urlencoded");
 //执行请求操作,并拿到结果(同步阻塞)
CloseableHttpResponse response = client.execute(httpPost);
//获取结果实体
HttpEntity entity = response.getEntity();
if (entity != null) {
//按指定编码转换结果实体为String类型
    result = EntityUtils.toString(entity, "utf-8");
    int code = response.getStatusLine().getStatusCode();
    String newUrl="";
    if (code == 302) {
       // 跳转的目标地址是在 HTTP-HEAD 中的
       Header header = response.getFirstHeader("location");
                newUrl = header.getValue(); // 这就是跳转后的地址,再向这个地址发出新申请,以便得到跳转后的信息是啥。
       httpPost = new HttpPost(host + newUrl);
       response = client.execute(httpPost);
       entity  = response.getEntity();
        result = EntityUtils.toString(entity, "utf-8");
            }
        }
        EntityUtils.consume(entity);
        //释放链接
        response.close();
一、创建http连接是,创建CookieStore并放入连接中,以便获取返回的cookie。
二、重定向返回的状态码是302,postman可以重定向到新的地址,但是发送http请求不会自动的重定向。所以,需要再次发送一次http请求。这就是为什么,postman请求没有问题,但是程序执行就302。(一般系统对接都是专门的接口,不会出现这种重定向的问题,其次现在大多数都是"Content-type":“application/json”都是json交互)
三、因为post方法数据提交格式是“application/x-www-form-urlencoded”,所以参数是拼接到url后面的。

** HTTP请求的状态码:**
地址:https://blog.csdn.net/lyh1023812/article/details/119810249
我遇到一个比较坑的对接需求,上传数据也是拼接到url后面。如果有中文会报错,解决:

//jsondata:包含中文的参数转码
String encode = URLEncoder.encode(jsondata, "utf-8");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java发送Http请求(获取响应cookie、重定向) 的相关文章

随机推荐

  • Nuxt.js整合axios

    整合 axios 默认整合 在构建项目时 xff0c 如果选择axios组件 xff0c nuxt js将自动与axios进行整合 手动整合 步骤1 xff1a package json有axios的版本 34 dependencies 3
  • Vuex 状态树

    根模块数据操作 步骤一 xff1a 创建 store index js 添加一个 counter变量 xff0c 并可以继续累加操作 export const state 61 61 gt counter 0 export const mu
  • Nuxt.js查询学生列表案例

    查询所有的班级 xff1a 后端 父工程pom文件 lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 gt lt project xmlns 61 34 http maven apach
  • 大数据面试题

    Hive理论知识汇总 1 Hive和数据库比较 Hive 和数据库除了拥有类似的查询语言 xff0c 再无类似之处 1 xff09 数据存储位置 Hive 存储在 HDFS 数据库将数据保存在块设备或者本地文件系统中 2 xff09 数据更
  • MyBatis Plus

    概述 简介 MyBatis Plus xff08 简称 MP xff09 是一个 MyBatis 的增强工具 xff0c 在 MyBatis 的基础上只做增强不做改变 xff0c 为简化开发 提高效率而生 特点 无侵入 xff1a 只做增强
  • MybatisPlus--QueryWrapper

    QueryWrapper wrapper介绍 Wrapper xff1a 条件构造抽象类 xff0c 最顶端父类 AbstractWrapper xff1a 用于查询条件封装 xff0c 生成 sql 的 where 条件 QueryWra
  • 大数据导论题库

    选择题 1 下面哪个程序负责 HDFS数据存储 C A NameNode B Jobtracker C Datanode D secondaryNameNode 2 HDfS 中的 block 默认保存几份 A A 3份 B 2 份 C 1
  • Oracle Linux7.8 下离线 一键静默安装Oracle12c

    目录 安装前的准备最小安装OracleLinux7 8 xff08 centos7 8一样 xff09 安装oracle需要的依赖包 准备Oracle安装包准备一键安装脚本 并执行脚本使用安装前配置 问题及解决方法 xff1a 错误码ORA
  • MybatisPlus-插件机制-乐观锁-逻辑删除-通用service

    插件机制 自动填充 项目中经常会遇到一些数据 xff0c 每次都使用相同的方式填充 xff0c 例如记录的创建时间 xff0c 更新时间等 我们可以使用MyBatis Plus的自动填充功能 xff0c 完成这些字段的赋值工作 原理 实现元
  • 畅购商城项目--(用户模块+用户注册【用户名占用】)

    搭建环境 4 1 1 后端web服务 xff1a changgou4 service web 修改pom xml文档 lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 gt lt pro
  • Mysql对于列中存储键值对数据的查询

    对于键值对数据的查询 为了方便查看 xff0c 将其称之为A表 A表 xff1a 可以看到A表中的列有 id inquiry id data key data value date key列中的各个字段对应的data value中的各个数据
  • PathVariable注解的用法以及报错

    今天碰见个很奇怪的问题 xff0c 因为之前在学校没怎么用过 64 PathVariable这个注解 xff0c 但是postman测试时并没有请求到 xff0c 具体如下 接口就是一个简单的查询详情 xff0c 而当我请求postman的
  • 关于@PreAuthorize注解的使用场景

    作用 64 PreAuthorize 能够在执行方法之前进行权限的认证 xff0c 支持Spring EL表达式 xff0c 基于方法注解和权限解决方案 xff0c 并且只有当 64 EnableGlobalMethodSecurity p
  • 获取 当前时间的前五天凌晨0点的时间

    公司今天提到的需求是 xff1a 每日凌晨两点 xff0c 调用方法 xff0c 方法的内容是 xff1a 拉取当前时间的前五天的0点的消息聊天记录 在网上查了好久才找到 xff0c 现在奉上代码 xff1a span class toke
  • 查询 按照 指定时间的前一天的数据

    需求 xff1a 查询按照指定时间的前一天的数据 xff0c 举个例子 xff1a 传入2023 2 27 xff0c 需要获取到2023 2 26 的数据 xff0c 如果这一天没有数据 xff0c 那就需要往前找 xff0c 直到找不到
  • 关于limit的使用场景

    什么情况下使用 limit 1呢 xff1f 当我们写sql语句的时候需要进行全表扫描 xff0c 前提我们已经确认返回的结果只有一条数据的时候 xff0c 使用limit 1 xff0c 因为使用limit 1 之后 xff0c 在查询过
  • 【STM32多级界面】-LCD结构体多级图形界面框架

    STM32多级界面搭建 在实际的项目之中 xff0c 需要用单片机在LCD OLED中搭建一个3级的图形界面 本文的工程文件我将上次传到百度网盘 xff0c 链接在最后的部分 STM32多级界面搭建一 方案选择二 实现效果三 程序设计3 1
  • ubuntu20.04系统安装u盘制作方法

    1 下载UltraISO软碟通 xff0c 下载Ubuntu20 04 2 打卡UltraISO xff0c 如下 3 加载Ubuntu20 04系统iso文件 文件 gt 打开 xff0c 如下 4 点击 启动 gt 写入硬盘映像 结果如
  • vue和react相同点_我试图在React,Unity,Godot,Construct,Game Maker和Phaser中制作相同的2D游戏原型。 这是我发现的。...

    vue和react相同点 I 39 m a tabletop game developer In designing a new card game I decided to build a digital prototype to hel
  • java发送Http请求(获取响应cookie、重定向)

    1 正常的发送Http请求 xff0c 获取返回值 xff08 json格式 xff09 span class token comment 引入的相关包 import org apache http HttpEntity import or