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.****.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大家都很熟悉了。
好了,到这里本文就结束了,有兴趣的可以关注我的微信公众号一起聊聊。