山东大学项目实训(三)HTTP
HTTP协议
HTTP(超文本传输协议)遵循请求与响应模式,并作为一个非状态less的应用层协议运行;其通信机制通常采用TCP连接。
HTTP协议的主要特点可概括如下:
1.遵循客户端/服务器架构。
2.仅需发送请求方式及路径信息即可完成服务请求操作。
3.常见的几种请求方式包括GET、HEAD及POST等技术手段来实现不同的通信功能与操作流程。
4.其机制极为简洁从而使得相应的HTTP服务器程序规模较小进而保证了通信速度的快捷性。
5.能够传输各种类型的媒体数据对象这些数据类型由Content-Type字段来标识以确保正确的数据解析与展示效果。
6.每次会话仅处理一个请求 request unit 后建立会话并自动关闭这一特点使得网络资源消耗降到最低限度同时保证了通信效率的高效性。
7.HTTP协议属于无状态协议类型 这种特点意味着如果后续需要获取前面的信息 则必须重新发送该部分数据 这可能导致每次会话的数据传输量有所增加。
8.如果服务器无需先前的信息 则其应答速度更快 这一特性为基于Web的应用系统提供了良好的用户体验保障
URL
URL(统一资源定位器)是一种特殊类型的URI(统一资源标识符)
URL的组成
http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
- 协议类型:该URL采用HTTP协议(http://),这是表示网页使用HTTP技术的标准格式。
- 域名指定:该URL的顶级域指定为"www.aspx fans.com"。
- 端部位置:位于域名之后的部分即为端口,在此位置之前使用冒号分隔。
- 虚拟目录范围:由域名后的第一个/至最后一个/所界定,在此范围内的路径构成虚拟目录系统。
- 文件名定位法则:
- 如果有疑问号存在,则文件名位于最后一位斜杠前
- 如果有哈希号存在,则文件名位于最后一位斜杠前
- 若两者均不存在,则文件名延伸至整个路径末端
- 锚点位置确定法则:以#开头至结尾的部分即为主锚
- 参数传递域定位法则:
- 从询问号起始至问号或哈希号分隔符之间区域构成参数传递域
- 在此区域内的所有字符均被解析器识别并执行相应操作
- 可用多个参数组合以增强功能多样性
HTTP请求信息的形式结构
- 请求数组的形式
- 请求数组中的元数据部分
- 请求数组中的详细内容
Head 信息结束后与 Body 信息之间应留空行(即使无 Body)
请求行为三部分,请采用何种请求方式确定请求路径使用何种协议?其中具体包括GET操作符 POST操作符 PUT操作符 DELETE操作符 TRACE操作符以及OPTIONS操作符等?确定请求路径:即为URL中的一部分内容。
使用telnet完成HTTP协议的POST请求
POST 1.php HTTP/1.1
Host:localhost
Content-type:application/x-www-from-urlencoded
Content-length:24
username=zhangsan&age=21
在头信息中需要明确主题信息的长短。
当采用页面表单方式提交时,则为"application/x-www-form-urlencoded";
当使用JSON格式(用于反序列化为字符串)时,则为"application/json"
GET和POST的区别
1.GET方法将数据放置在URL之后,并通过?分隔URL与传输内容;各参数间以&符号连接。而POST方法则将数据直接放置在HTTP包的Body中完成传输。
2.GET方法的数据量受制于浏览器对URL长度的最大容量限制;而POST方法无此限制可言。
3.获取数据时采用Request.QueryString方法(GET)或Request.Form方法(POST)。
4.采用GET方式提交可能导致安全漏洞如被缓存攻击利用的问题。
在Java语言中进行HTTP请求处理时,默认情况下无法直接支持一些高级功能。因此推荐优先采用Java标准库中的HttpURLConnection类来完成相关操作。其中HttpURLConnection属于Java标准库中的核心组件,在网络编程中具有重要地位。此外也可以借助如HTTPClient等第三方开源框架来完成相关的HTTP请求处理工作,在实际应用中可以根据具体需求选择合适的解决方案。其中HttpURLConnection类提供了一系列基础但强大的API接口供开发者调用以完成诸如GET、POST等多种 HTTP 请求方法的操作流程如下:第一步初始化一个HttpURLConnection实例并配置必要的属性参数;第二步调用其post方法绑定目标URL路径并传递所需的字段参数;第三步启动连接建立与服务器的数据传输通道;第四步发送完整的JSON数据包等待服务器返回响应结果;第五步捕获返回状态码并解析响应内容完成整个数据交互过程
public static String doPost(String httpUrl, String param) {
HttpURLConnection connection = null;
InputStream is = null;
OutputStream os = null;
BufferedReader br = null;
String result = null;
try {
URL url = new URL(httpUrl);
// 通过远程url连接对象打开连接
connection = (HttpURLConnection) url.openConnection();
// 设置连接请求方式
connection.setRequestMethod("POST");
// 设置连接主机服务器超时时间:15000毫秒
connection.setConnectTimeout(15000);
// 设置读取主机服务器返回数据超时时间:60000毫秒
connection.setReadTimeout(60000);
// 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true
connection.setDoOutput(true);
// 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无
connection.setDoInput(true);
// 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
// 设置鉴权信息:Authorization: Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0
connection.setRequestProperty("Authorization", "Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0");
// 通过连接对象获取一个输出流
os = connection.getOutputStream();
// 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的
os.write(param.getBytes());
// 通过连接对象获取一个输入流,向远程读取
if (connection.getResponseCode() == 200) {
is = connection.getInputStream();
// 对输入流对象进行包装:charset根据工作项目组的要求来设置
br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
StringBuffer sbf = new StringBuffer();
String temp = null;
// 循环遍历一行一行读取数据
while ((temp = br.readLine()) != null) {
sbf.append(temp);
sbf.append("\r\n");
}
result = sbf.toString();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
if (null != br) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != os) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 断开与远程地址url的连接
connection.disconnect();
}
return result;
}
解析json
服务端返回的数据呈现为字符串类型变量的形式
通过调用Gson来解码该字符串从而获取所需的密钥
在Java领域中,Gson被定义为由谷歌官方开发的一种支持JSON与Java对象之间相互转换的序列化与反序列化库
在项目构建信息文件pom.xml中添加相应的配置项
<dependencies>
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
</dependencies>
就可以使用了
然后根据字符串所对应的json结构逐层解析
例如
{
"ret": 200,
"data'": {
"err_ code": 0,
"err_ msg": "
"data": {
"id": 1,
"uuid": ""
"add_ time": "2021-07-02 09:34:08",
"update_ time": null,
"ext_ _data": null,
"user_ name": "张三",
"keyWord": "123"
}
"model_ name": "user_ key"
},
"msg": "V3.3.0 YesApi App. Table .Get"
}
从上述json中取出keyWord
public static String analysis(String result){
JsonParser parser = new JsonParser();
JsonObject jsonObject = parser.parse(result).getAsJsonObject();
JsonObject data = jsonObject.get("data").getAsJsonObject();
JsonObject data_data = data.get("data").getAsJsonObject();
String keyWord = data1.get("keyWord").getAsString();
return keyWord;
}
