Java中简单Http请求
原文地址:
1. 概述
在这篇快速教程中,我们将使用Java内置类HttpUrlConnection来实现一个Http请求。
2. HttpUrlConnection
HttpUrlConnection类允许我们不用添加其他任何类库就能实现基本的Http请求。所有需要的类都包含在 java.net包内。缺点是,相比于其他http类库,该方法有点笨重,而且也没有提供一些高级特性的API,比如添加请求头,添加认证等。不过这些都不要紧。你完全可以将这个实现封装一下,添加一些高级特性也不是很复杂。
如果你只是想快速地进行些Http请求而不想添加一些类库的话,本文的这些代码就足够了。
另外,如果你对java的http请求基本实现不很了解,本文给出的代码也会有些帮助。
3. 创建请求
HttpUrlConnection类的创建是通过URL 类的openConnection()方法。这个方法只是创建一个连接对象,并不建立连接。
通过设置requestMethod属性,HttpUrlConnection类可以创建各种请求类型——包括GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE。
比如创建一个GET请求:
URL url = new URL("www.baidu.com"); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setRequestMethod("GET");
4. 添加请求参数
如果我们想要添加请求参数,我们需要设置doOutput 为true,然后将请求参数拼接成字符串,格式param1=value¶m2=value,以流的形式写入到HttpUrlConnection 实例的OutputStream中。示例代码如下:
1 Map<String, String> parameters = new HashMap<>(); 2 parameters.put("param1", "val"); 3 4 con.setDoOutput(true); 5 DataOutputStream out = new DataOutputStream(con.getOutputStream()); 6 out.writeBytes(ParameterStringBuilder.getParamsString(parameters)); 7 out.flush(); 8 out.close();
为方便转换字符串参数,我写了个工具类ParameterStringBuilder。类中包含一个静态方法getParamsString()将Map转换成对应格式的字符串:
1 public class ParameterStringBuilder { 2 public static String getParamsString(Map<String, String> params) 3 throws UnsupportedEncodingException{ 4 StringBuilder result = new StringBuilder(); 5 6 for (Map.Entry<String, String> entry : params.entrySet()) { 7 result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); 8 result.append("="); 9 result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); 10 result.append("&"); 11 } 12 13 String resultString = result.toString(); 14 return resultString.length() > 0 15 ? resultString.substring(0, resultString.length() - 1) 16 : resultString; 17 } 18 }
5. 添加请求头
通过setRequestProperty() 方法可以添加请求头:
1 con.setRequestProperty("Content-Type", "application/json");
通过getHeaderField()方法可以读取响应头:
1 String contentType = con.getHeaderField("Content-Type");
6. 配置超时时间
类允许我们设置连接超时时间和读取超时时间。这些值决定了连接建立的最大等待时间间隔或读取到达数据的最大等待时间间隔。
设置超时时间,我们可以调用方法setConnectTimeout() 和方法setReadTimeout():
1 con.setConnectTimeout(5000); 2 con.setReadTimeout(5000);
这个例子中我们将超时时间设为5秒。
7. 处理Cookies
java.net 包包含的类CookieManager,HttpCookie等能很便捷地处理Cookies.
首先,从响应中读取cookies,我们先获取相应头里的Set-Cookie值,然后解析成HttpCookie对象的List.
1 String cookiesHeader = con.getHeaderField("Set-Cookie"); 2 List<HttpCookie> cookies = HttpCookie.parse(cookiesHeader);
接下来,我们将cookies存储起来:
1 cookies.forEach(cookie -> cookieManager.getCookieStore().add(null, cookie));
我们检查cookies中是否包含一个username属性,如果不包含,我们把一个叫zhangsan的username添加进去:
1 Optional<HttpCookie> usernameCookie = cookies.stream() 2 .findAny().filter(cookie -> cookie.getName().equals("username")); 3 if (usernameCookie == null) { 4 cookieManager.getCookieStore().add(null, new HttpCookie("username", "john")); 5 }
最后,将cookies添加到请求中去,我们需要在关闭连接和重新打开连接后,添加Cookie请求头 :
1 con.disconnect(); 2 con = (HttpURLConnection) url.openConnection(); 3 4 con.setRequestProperty("Cookie", 5 StringUtils.join(cookieManager.getCookieStore().getCookies(), ";"));
8. 处理重定向
我们可以通过调用方法setInstanceFollowRedirects(),设置为true或者false,来控制是否允许一个特定连接自动跟随重定向:
1 con.setInstanceFollowRedirects(false);
也可以全局设置所有的连接是否允许自动跟随重定向:
1 HttpUrlConnection.setFollowRedirects(false);
默认是允许自动跟随重定向的。
请求返回状态码301,302表示重定向,我们可以获取响应头的Location属性并用新的URL创建一个新的连接。
1 if (status == HttpURLConnection.HTTP_MOVED_TEMP 2 || status == HttpURLConnection.HTTP_MOVED_PERM) { 3 String location = con.getHeaderField("Location"); 4 URL newUrl = new URL(location); 5 con = (HttpURLConnection) newUrl.openConnection(); 6 }
9. 读取响应
通过读取HttpUrlConnection实例的InputStream流来读取响应。
读取响应常用方法有getResponseCode(), connect(), getInputStream() or getOutputStream() 。
比如,读取响应状态码:
1 int status = con.getResponseCode();
比如,读取响应头:
1 String contentType = con.getHeaderField("Content-Type");
比如,读取响应文本:
1 BufferedReader in = new BufferedReader( 2 new InputStreamReader(con.getInputStream())); 3 String inputLine; 4 StringBuffer content = new StringBuffer(); 5 while ((inputLine = in.readLine()) != null) { 6 content.append(inputLine); 7 } 8 in.close();
关闭连接:
1 con.disconnect();
结论
在这篇文章中,我们展示了如何通过HttpUrlConnection类来时间Http请求。以下代码可以直接拷贝使用。由于太简单,就不传github了。
转载于:https://www.cnblogs.com/xiaoshen666/articles/10677611.html
Java中简单Http请求相关推荐
- java http请求 乱码_怎么解决java中的http请求乱码
怎么解决java中的http请求乱码 发布时间:2020-06-23 20:00:11 来源:亿速云 阅读:90 作者:元一 怎么解决java中的http请求乱码?针对这个问题,今天小编总结了这篇文章 ...
- JAVA中简单的MD5算法——MD5Utils
文章目录 MD5信息摘要算法 Java中简单的MD5加密类MD5Utils 今日推歌 MD5信息摘要算法 MD5(Message Digest) 它是一种哈希算法,不是一种加密算法,任何长度的任意内容 ...
- java中使用ajax请求数据格式化,ajax请求服务器返回json数据格式化
JQuery--实现Ajax应用 实现Ajax应用 1 .load()异步请求数据,通过Ajax请求加载服务器中的数据,并把返回的数据放置到指定的元素中,调用格式为load(url,[data], ...
- java中使用ajax请求数据格式,Java基本数据类型 javascript中post和ajax提交 Axure
Java基本数据类型 Java一共有八种基本类型,六种数据类型,一种字符类型,一种布尔类型 分别是 byte 是数据类型内存大小1,内存位数是8位,最小值是-128(-27),最大值:127(27-1 ...
- 如何在java中简单实现音乐播放
如何实现java程序播放音乐文件(以wav文件为例) Java Sound API是javaSE平台提供底层的(low-level)处理声音接口,可以实现音频文件的播放. 根据这点我们可以尝试写一个类 ...
- 胡博君解Java中简单工厂模式
为什么要用简单工厂模式: 我们都知道程序是分开的,客户端中有程序,服务器端有程序,一般来说我们写的main方法中的程序都是在客户端电脑中的,按照我们学习的时候喜欢的写法: //一般来说这个程序都是在客 ...
- java中简单的if语句_java中if语句的写法
if语句 if 语句的语法如下:if(布尔表达式){ //如果布尔表达式为true将执行的语句 } 如果布尔表达式的值为 true,则执行 if 语句中的代码块,否则执行 if 语句块后面的代码. 免 ...
- java中简单的快速排序_【新手自白书】简单快速排序的实现(JAVA)
复习一下快速排序 快速排序(Quicksort)是对冒泡排序的一种改进.快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分 ...
- Java中,简单的List转Set实现
使用Set自带的方法进行List到Set的转换 public static void main(String[] args) {List<String> strList = new Arr ...
- Java 中如何模拟真正的同时并发请求?
有时需要测试一下某个功能的并发性能,又不要想借助于其他工具,索性就自己的开发语言,来一个并发请求就最方便了. java中模拟并发请求,自然是很方便的,只要多开几个线程,发起请求就好了.但是,这种请求, ...
最新文章
- 随机森林RandomForest挖掘生物标记预测分类
- CentOS 安装配置memcached
- 一个自己写的PHP模板引擎
- 【Spark 深入学习 04】再说Spark底层运行机制
- 技术干货 | jsAPI 方式下的导航栏的动态化修改
- 浅析Mysql InnoDB存储引擎事务原理
- javascript 函数属性prototype(转)
- 第10章尚硅谷SpringBoot检索
- MySQL中 Data truncated for column ‘xxx‘解决方法
- Window 浏览器窗口对象
- 用OOP设计以下场景。太阳发出太阳光,照射在墙壁上,在地面形成影子。
- 不用写采集规则也可以轻松采集网站文章,揭秘一款明泽文章采集软件的工作原理
- 搬砖方法论:上帝对象(God Object)
- C语言提取PDF字符串,C语言资料精华.pdf
- 替换单词c语言程序,用c语言完成单词替换
- Everything研究之读取NTFS下的USN日志文件(1)
- web2.0中流行的设计元素:颜色
- Linux系统centos7关闭防火墙命令
- App 应用托管平台
- java毕业生设计疫情防控网站计算机源码+系统+mysql+调试部署+lw
热门文章
- Prototype使用$()函数
- 【渝粤教育】国家开放大学2019年春季 45烹饪原料学(1) 参考试题
- 【Python实例第14讲】普通判别分析与缩水判别分析
- 计算机网络基础系列(四)HTTP、七层模型及其内部对应协议
- 【浙江大学PAT真题练习乙级】1008 数组元素循环右移问题 (20分)真题解析
- Lecture 7:策略梯度
- 自己的阿里云部署了django发现连不上, 一下是网上查的解决方法,亲测可用
- Linux 创建和销毁 urb
- Day-04 基础数据类型list, tuple
- load data file使用详解