HTTP协议
【HTTP协议】
HTTP 协议是超文本传输控制协议
HTTP 协议中定义了客户端与服务端的通信流程与数据交互格式
【网络通信中的长连接与短链接】
长连接:
当客户端与服务端连接成功后,使用该连接处理后续 IO 流操作,连接不关闭
短连接:
当客户端需要向服务端发送请求时,创建连接,一旦服务端返回响应后,客户端接受完毕,连接断开。如果需要再次发送请求,则再次创建连接。
常见长连接案例:
IM(即时通讯)、大型游戏
常见短链接案例:
绝大多数APP都是短链接
使用原则:
能用短连接的就用短连接
【客户端与服务端的通信流程】
HTTP 协议是一款基于短连接的协议。所以 HTTP 协议是一款无状态协议,我们在必要时候需要实现 HTTP 协议的状态管理
【请求数据包的格式】
1、请求行
GET /android_jsp/flight_index.jsp HTTP/1.1
GET:请求方式
/android_jsp/flight_index.jsp
:请求资源路径
HTTP/1.1
:协议的类型与版本
2、若干消息头 Header
key:value
key:value
用于告诉服务端,客户端的状态以及客户端传递数据的状态信息
3、请求实体
主要用于在 POST 请求下存放请求参数数据
4、响应数据包的格式
①状态行
HTTP/1.1 200 OK
HTTP/1.1
:协议的类型与版本
200
:状态码
OK
:状态描述
②若干消息头
key:value
key:value
通过这些消息头告诉客户端服务端的状态以及服务端传递参数的状态信息。
③响应实体
用于存储具体的响应数据。
【GET/POST两种请求方式的区别】
1、请求参数的存放位置
GET:请求资源路径后用 ? 拼接
POST:请求数据包的请求实体中
2、是否适合传递中文
GET:不适合
POST:适合
3、是否适合大数据量提交
GET:不适合
POST:适合
4、安全性
GET:相对不安全
POST:请求数据包的请求实体中
发送HTTP GET请求
1、创建 URL 对象
URL url = new URL("http://ip:port/app/path");
2、通过 URL 对象获取 HttpUrlConnection:
HttpUrlConnection conn = (强转)url.openConnection();
3、发送请求并且获取响应输入流:
is = conn.getInputStream();)(网络操作,耗时)
4、is 就是服务端返回的响应实体数据,把输入流中的数据读取出来,获取响应字符串
5、解析响应字符串
【栗子】
xml中增加一个 id 为 btn_connect 按钮
MainActivity
public class TestActivity extends Activity {
private Button btn_connect;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setViews();
}
private void setViews() {
btn_connect = findViewById(R.id.btn_connect);
btn_connect.setOnClickListener(v -> {
new Thread() {
@Override
public void run() {
try {
findFlightsByGet();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
});
}
private void findFlightsByGet() throws IOException {
URL url = new URL("http://192.168.3.208:8080/android_jsp/flight_index.jsp");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
InputStream is = conn.getInputStream();
StringBuilder respText = new StringBuilder();
String line = null;
BufferedReader bf = new BufferedReader(new InputStreamReader(is, "utf-8"));
while ((line = bf.readLine()) != null) {
respText.append(line);
}
Log.d("info", "" + respText);
}
}
AndroidManifest.xml增加权限
<uses-permission android:name="android.permission.INTERNET"/>
我们需要抓包观察数据,我们可以 使用Eclipse自带抓包工具 或者 使用Fiddler抓取手机端APP接口数据。建议使用后者
我们可以看到链接是 http://192.168.3.208:8080/android_jsp/flight_index.jsp
,其中 192.168.3.208 是链接的网络 ip。
运行程序,点击按钮,观察日志
可以查看 Fiddler 的抓包的结果:
增加参数
链接可以增加参数,如
http://192.168.3.208:8080/android_jsp/flight_index.jsp?date=2021-7-24
所以可以在例子中增加一个Edittext,根据输入的日期进行查询
MainActivity
public class TestActivity extends Activity {
......
private EditText et_date;
......
private void setViews() {
et_date = findViewById(R.id.et_date);
......
}
private void findFlightsByGet() throws IOException {
String d = et_date.getText().toString();
URL url = new URL("http://192.168.3.208:8080/android_jsp/flight_index.jsp" + ("".equals(d) ? "" : ("?date=" + d)));
......
}
}
可以观察 Fiddler 抓到的链接
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)