Hello Http

Http很多人会用,但是他具体的一些细节,其实很多人是不知道的,所以你看完本篇文章之后,你就明白他的大部分概念了,本文会从概念,Http通信,TCP三次握手,Okhttp等知识一步步引导大家去熟悉这个知识点。

一.什么是Http

Http协议是超文本传输协议,定义了浏览器怎么向万维网服务器请求和推送万维网文档。具体可以详看百度百科。

二.Http工作流程

C:客户端 S:服务端

  • 1.C/S建立连接
  • 2.C向S发送请求
  • 3.S向C作出应答
  • 4.C接收对应返回的数据

三.URL组成

URL一般分为四个部分

  • 1.协议部分,一般是http或者https开头
  • 2.域名部分 也可以用ip
  • 3.端口部分 一般Wie :8080
  • 4.参数部分 一般为 ?id=1&

四.TCP三次握手


图片摘抄:https://blog.csdn.net/qq_38950316/article/details/81087809

简单来讲:客户端向服务端发送一个SYN信息表示有一个客户端想跟服务端通信,服务端收到SYN之后会返回一个ACK信息给客户端确认,客户端收到ACK之后会再次发送一个ACK给服务端,当服务端收到客户端发送的ACK就知道并建立连接了。

五.Http特点

  • 1.简单快速,直接GET,POST等就可以请求
  • 2.灵活使用,允许传输任意数据,有一个Content-Type标记
  • 3.无连接,每次连接只处理一个请求然后断开
  • 4.无状态,返回结果后就算了一次成功交互,不管是成功与否

六.Http和Https区别

1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

Http:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从www服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。

Https:是以安全为目标的Http通道,简单讲是HTTP的安全版,即Http下加入SSL层,Http的安全基础是SSL,因此加密的详细内容就需要SSL。

Https协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

七.Http状态码

  • 1.信息代码:1xx,
  • 2.成功代码:2xx,
  • 3.重定向:3xx,
  • 4.客户端错误:4xx,
  • 5.服务器错误:5xx

关于每个状态码的具体含义,可以参考:https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

八.GET

HttpURLConnection这个类就是来操作相关的请求的,常见的请求文本,示例代码

/**
 * 请求
 *
 * @param url
 * @return
 */
private String get(String url) {
    try {
        URL mUrl = new URL(url);
        HttpURLConnection conn = (HttpURLConnection) mUrl.openConnection();
        //设置超时
        conn.setReadTimeout(5 * 1000);
        //设置请求方法
        conn.setRequestMethod("GET");
        InputStream is = conn.getInputStream();
        BufferedReader bfr = new BufferedReader(new InputStreamReader(is));
        StringBuffer sb = new StringBuffer();
        String str = "";
        while ((str = bfr.readLine()) != null) {
            sb.append(str);
        }
        return sb.toString();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

我们只需要简单的几个步骤就能拿到数据,再来看下请求图片的方法

/**
 * 请求图片
 *
 * @param url
 * @return
 */
private Bitmap getImg(String url) {
    try {
        URL mUrl = new URL(url);
        HttpURLConnection conn = (HttpURLConnection) mUrl.openConnection();
        //设置超时
        conn.setReadTimeout(5 * 1000);
        //设置请求方法
        conn.setRequestMethod("GET");
        InputStream is = conn.getInputStream();
        //文件名
        String fileName = System.currentTimeMillis() + ".png";
        //文件路径
        File filePath = null;
        //文件读写
        FileOutputStream fos = null;
        //SD卡是否挂载
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            File parent = Environment.getExternalStorageDirectory();
            filePath = new File(parent, fileName);
            fos = new FileOutputStream(filePath);
        } else {
            return null;
        }
        byte[] bytes = new byte[2 * 1024];
        int lens = 0;
        Bitmap bitmap = null;
        if (fos != null) {
            while ((lens = is.read(bytes)) != -1) {
                fos.write(bytes, 0, lens);
            }
            bitmap = BitmapFactory.decodeFile(filePath.getAbsolutePath());
        }
        return bitmap;
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (ProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

九.POST

/**
 * POST
 * @param url
 * @param params
 * @return
 */
private String post(String url, String params) {
    try {
        URL mUrl = new URL(url);
        HttpURLConnection conn = (HttpURLConnection) mUrl.openConnection();
        //设置超时
        conn.setReadTimeout(5 * 1000);
        //设置请求方法
        conn.setRequestMethod("POST");
        //设置类型
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        //设置长度
        conn.setRequestProperty("Content-Length", String.valueOf(params.getBytes().length));
        //获得输出流
        OutputStream os = conn.getOutputStream();
        //写入数据
        os.write(params.getBytes());
        if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
            InputStream is = conn.getInputStream();
            BufferedReader bfr = new BufferedReader(new InputStreamReader(is));
            StringBuffer sb = new StringBuffer();
            String str = "";
            while ((str = bfr.readLine()) != null) {
                sb.append(str);
            }
            return sb.toString();
        } else {
            return null;
        }
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

十.put

put和post是一样的,只需要setRequestMethod改成PUT即可,并且setRequestProperty这两个不需要设置也是可以的

十一.Postman

postman是一款很好的调试接口的工具。有兴趣的自己去安装和使用

安装教程

十二.Charles

charles是一款很好用的抓包工具,在和后端调试的时候可以很方便的帮助你抓取各类信息

学习教程

十三.OkHttp

OkHttp我之前有写过文章,虽然现在我自己看起来,还是有一些遗漏需要补充,但是不妨碍大伙看下,毕竟OkHttp大家都很熟悉了。

OkHttp封装

好了,到这里本文就结束了,有兴趣的可以关注我的微信公众号一起聊聊。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘某人程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值