概述
作为一个java开发,自己肯定写过或者用过HttpUtils用来发送http请求吧,而且肯定也见过各种五花八门的工具类吧,而且每个都不一样,内心有没有写一个相对标准的工具类的想法呢?反正我自己是有这种想法的,毕竟Http是有标准的,刚好机会来了,就按照自己理解的标准去写了,分享一下,当然也会提供一些比较容易扩展的方式,毕竟每个人的需求都是不同的。
前面会用一定的篇幅讲述一下我所依赖的“标准”到底是什么样的,后面再贴代码。Http的四要素
众所周知,Http是基于TCP,而TCP是用来传输数据的,说得再通俗一些,就是用来传递字符串的。那么这个字符串到底要如何传递以及如何解析,这就是应用层协议需要设计的,我们平时见到的应用层协议都是围绕“如何来传递字符串”这个目标然后实现的(如何传递也意味着如何解析),Http也是,它的标准就是4要素,或者是4块内容。1.请求行
请求行占了一行,格式是:方法 请求地址 HTTP/版本号后面中间分别有1个空格
2.请求头
这个是多行,每一行都是key:value的形式
3.空行
就是一个空行,用于区分请求头和请求体
4.请求体
请求体就是我们常说的body或者form部分了。这个行数不定,那如何知道结尾了呢?就要用请求头里面所标记的Content-Length来判断了,用一些框架在解析的时候,如何发现Length的长度和请求体的长度不一致的时候,就会出现异常。包括接收Http请求或者请求http的时候。对于Http的响应也是这4要素。
Http传递参数的方式
其实HttpUtils要解决的问题就是http参数传递的问题,因此想写出好的工具类,那就必须知道所有的传参方式,哪怕自己不用,也可以不写,但得知道。上面花那么多篇幅讲4要素,顺便也把所有的参数传递方式讲了一遍,我这边总结一下,下面的几种参数,只有请求体里面只能允许一种情况存在,其它的都可以存在。请求方法,这也算参数吧,因为在用的时候需要用。
请求地址。
路径参数。
请求头参数。
请求体参数。HttpUtils的代码
 public static String sendGet(String url, String param) {String result = "";BufferedReader in = null;try {String urlNameString = url + "?" + param;URL realUrl = new URL(urlNameString);// 打开和URL之间的连接URLConnection connection = realUrl.openConnection();// 设置通用的请求属性connection.setRequestProperty("accept","*/*");connection.setRequestProperty("connection","Keep-Alive");connection.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");// 建立实际的连接connection.connect();// 获取所有响应头字段Map<String, List<String>> map = connection.getHeaderFields();// 遍历所有的响应头字段for (String key : map.keySet()) {System.out.println(key + "--->" + map.get(key));}// 定义 BufferedReader输入流来读取URL的响应in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("发送GET请求出现异常!" + e);e.printStackTrace();}// 使用finally块来关闭输入流finally {try {if (in != null) {in.close();}} catch (Exception e2) {e2.printStackTrace();}}return result;}/*** 发送请求,如果失败,会返回null** @param url* @param map* @return*/public static String post(String url, Map<String, String> map) {// 处理请求地址try {HttpClient client = HttpClientBuilder.create().build();URI uri = new URI(url);HttpPost post = new HttpPost(uri);// 添加参数List<NameValuePair> params = new ArrayList<NameValuePair>();for (String str : map.keySet()) {params.add(new BasicNameValuePair(str, map.get(str)));}post.setEntity(new UrlEncodedFormEntity(params, Charset));// 执行请求HttpResponse response = client.execute(post);if (response.getStatusLine().getStatusCode() == 200) {// 处理请求结果StringBuffer buffer = new StringBuffer();InputStream in = null;try {in = response.getEntity().getContent();BufferedReader reader = new BufferedReader(new InputStreamReader(in, Charset));String line = null;while ((line = reader.readLine()) != null) {buffer.append(line);}} catch (Exception e) {e.printStackTrace();} finally {// 关闭流if (in != null) {try {in.close();} catch (Exception e) {e.printStackTrace();}}}return buffer.toString();} else {return null;}} catch (Exception e1) {e1.printStackTrace();}return null;}/*** 发送请求,如果失败,会返回null** @param url* @param map* @return*/public static StringBuffer postbuffer(String url, Map<String, String> map) {// 处理请求地址try {HttpClient client = HttpClientBuilder.create().build();URI uri = new URI(url);HttpPost post = new HttpPost(uri);// 添加参数List<NameValuePair> params = new ArrayList<NameValuePair>();for (String str : map.keySet()) {params.add(new BasicNameValuePair(str, map.get(str)));}post.setEntity(new UrlEncodedFormEntity(params, Charset));// 执行请求HttpResponse response = client.execute(post);if (response.getStatusLine().getStatusCode() == 200) {// 处理请求结果StringBuffer buffer = new StringBuffer();InputStream in = null;try {in = response.getEntity().getContent();BufferedReader reader = new BufferedReader(new InputStreamReader(in, Charset));String line = null;while ((line = reader.readLine()) != null) {buffer.append(line);}} catch (Exception e) {e.printStackTrace();} finally {// 关闭流if (in != null) {try {in.close();} catch (Exception e) {e.printStackTrace();}}}return buffer;} else {return null;}} catch (Exception e1) {e1.printStackTrace();}return null;}/*** 发送请求,如果失败会返回null** @param url* @param str* @return*/public static String post(String url, String str) {// 处理请求地址try {HttpClient client = HttpClientBuilder.create().build();URI uri = new URI(url);HttpPost post = new HttpPost(uri);post.setEntity(new StringEntity(str, Charset));// 执行请求HttpResponse response = client.execute(post);if (response.getStatusLine().getStatusCode() == 200) {// 处理请求结果StringBuffer buffer = new StringBuffer();InputStream in = null;try {in = response.getEntity().getContent();BufferedReader reader = new BufferedReader(new InputStreamReader(in, "utf-8"));String line = null;while ((line = reader.readLine()) != null) {buffer.append(line);}} finally {// 关闭流if (in != null) {in.close();}}return buffer.toString();} else {return null;}} catch (Exception e) {e.printStackTrace();}return null;}public static StringBuffer postbuffer(String url, String str) {// 处理请求地址try {HttpClient client = HttpClientBuilder.create().build();URI uri = new URI(url);HttpPost post = new HttpPost(uri);post.setEntity(new StringEntity(str, Charset));// 执行请求HttpResponse response = client.execute(post);if (response.getStatusLine().getStatusCode() == 200) {// 处理请求结果StringBuffer buffer = new StringBuffer();InputStream in = null;try {in = response.getEntity().getContent();BufferedReader reader = new BufferedReader(new InputStreamReader(in, "utf-8"));String line = null;while ((line = reader.readLine()) != null) {buffer.append(line);}} finally {// 关闭流if (in != null) {in.close();}}return buffer;} else {return null;}} catch (Exception e) {e.printStackTrace();}return null;}public static String post2(String curl, String param) {String result = "";// 返回的结果BufferedReader in = null;// 读取响应输入流try {//创建连接URL url = new URL(curl);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setDoOutput(true);connection.setDoInput(true);connection.setRequestMethod("POST");connection.setUseCaches(false);connection.setInstanceFollowRedirects(true);connection.setRequestProperty("Content-Type","application/json;charset=UTF-8");connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36)");//防止报403错误。connection.connect();//POST请求BufferedWriter out = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream(),"UTF-8"));out.write(param);out.flush();out.close();//读取响应// 定义BufferedReader输入流来读取URL的响应,并设置编码方式in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));String line;// 读取返回的内容while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {e.printStackTrace();System.out.println("Http请求方法内部问题");} finally {try {if (in != null) {in.close();}} catch (IOException ex) {ex.printStackTrace();}}return result;}/*** 发送GET方式的请求,并返回结果字符串。** @param url* @return 如果失败,返回为null*/public static String get(String url) {try {HttpClient client = HttpClientBuilder.create().build();URI uri = new URI(url);HttpGet get = new HttpGet(uri);HttpResponse response = client.execute(get);if (response.getStatusLine().getStatusCode() == 200) {StringBuffer buffer = new StringBuffer();InputStream in = null;try {in = response.getEntity().getContent();BufferedReader reader = new BufferedReader(new InputStreamReader(in, Charset));String line = null;while ((line = reader.readLine()) != null) {buffer.append(line);}} finally {if (in != null) {in.close();}}return buffer.toString();} else {return null;}} catch (Exception e) {e.printStackTrace();}return null;}
总结

HttpUtils一个很常用的工具类,非原创有借鉴https://blog.csdn.net/ywg_1994/article/details/104487216文章,介绍很详细可以看看

HttpUtils工具类相关推荐

  1. 超好用的后端发送http请求HttpUtils工具类(基于原生http连接,不需要另外导包)

    在项目中,为了实现一些特定的功能,我们常常需要发送http异步请求 ,为此需要特意封装一个实用的HttpUtils工具类 HttpUtils工具类内容如下: package com.zyw.secki ...

  2. HttpUtils工具类 java程序 发起 网络请求

    HttpUtils工具类 用于java程序 发起 网络请求 @Slf4j public class OkHttpUtils {private static final String HTTP_JSON ...

  3. Java 常用HTTP请求工具类HttpUtils

    .pom依赖 <!-- httpclient --><dependency><groupId>org.apache.httpcomponents</group ...

  4. android httputils更换成https请求,Android开发工具类之HttpUtils

    今天我们讲常用的开发工具类之HttpUtils,我发现上两次,我对于每个方法都进行了一定的解释,有人跟我评论和留言说,不用我解释,这么简单,这么明显的使用方法,再笨的人也能看懂,多此一举,好吧,这次我 ...

  5. 【转】 Android快速开发系列 10个常用工具类 -- 不错

    原文网址:http://blog.csdn.net/lmj623565791/article/details/38965311 转载请标明出处:http://blog.csdn.net/lmj6235 ...

  6. android 快速开发常用工具类,实例详解Android快速开发工具类总结

    一.日志工具类 Log.java public class L { private L() { /* 不可被实例化 */ throw new UnsupportedOperationException ...

  7. Android开发常用工具类

    来源于http://www.open-open.com/lib/view/open1416535785398.html 主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java. 目前 ...

  8. Android快速开发系列 10个常用工具类

    目录(?)[+] 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38965311,本文出自[张鸿洋的博客] 打开大家手上的项目,基 ...

  9. Android常用的工具类

    2019独角兽企业重金招聘Python工程师标准>>> 最新最准确内容建议直接访问原文:Android常用的工具类 主要介绍总结的Android开发中常用的工具类,大部分同样适用于J ...

  10. 发送http和https请求工具类 Json封装数据

    在一些业务中我们可要调其他的接口(第三方的接口) 这样就用到我接下来用到的工具类. 用这个类需要引一下jar包的坐标 <dependency><groupId>org.jsou ...

最新文章

  1. 临平职高计算机专业高职考大学,临平职高高考再传捷报 本科连续四年蝉联杭州市第一...
  2. python基础学习22----协程
  3. 文件、格式-【Cocos2D-X 】初窥门径(10)解决中文乱码-by小雨
  4. Log4j 2使用教程转
  5. 你不就是加了 2 行代码,为什么要用 2 天?
  6. 如何免安装服务器将 React 整合进 Spring Boot
  7. Java高并发程序设计(六)--线程池(1)
  8. Netty writeAndFlush() 流程与异步
  9. 哥大首位华裔女校长:人工智能的春天来了
  10. css编写规则BEM
  11. 盘点2018:数据和云最受欢迎的十大精品文章
  12. php 服务定位,服务定位器(Service Locator)
  13. 深刻反省:好的习惯必须坚持,不论心情怎样
  14. cocos studio和cocosbuilder什么区别
  15. android检测cup温度工具,Android如何实现获取手机CPU的温度?
  16. 自定义小程序中的showToast
  17. 考研政治——马克思三大定律之否定之否定
  18. 把笔记本改造成无线路由器 —— 手机抓包牛刀小试
  19. 干货 :超详细的AI 专家路线图!
  20. js美化系统默认Prompt仿APP移动端弹出,可以自行修改

热门文章

  1. activiti6教程四
  2. 记录一次重装win10系统的流程
  3. gitlab 远程仓库回退到指定版本
  4. 伯努利方程(压力与流量的关系)
  5. html 手机端原型,Axure教程:移动端原型如何适配不同分辨率的手机?
  6. iWebOffice
  7. Ubuntu20.04 安装向日葵SunloginClient并解决报错缺少依赖问题
  8. yahoo也推出站点统计了
  9. 学生体温打卡系统Java+MySQL
  10. 看拉扎维《模拟CMOS集成电路设计》的一些总结和思考(八)——反馈