HTTP和HTTPS的区别
HTTP | HTTPS | |
---|---|---|
端口 | 80 | 443 |
数据传输方式 | 明文传输 | 加密传输 |
真假网站识别 | 很容易被复制 | 使用证书,很难被复制 |
浏览器显示区别 | 浏览器显示问好,提示不安全 | 浏览器显示小锁,提示安全 |
门槛 | 不需要证书 | 需要Gworg机构颁发证书,需要一定的成本 |
安全性 | 很容易被劫持,跳转到其他网站 | 加密安全,很难劫持,交易数据加密 |
URL
下图是对URL 例子的解释,可以知道这个地址没有端口,是因为其使用了默认端口,如果不是默认端口就需要在域名后面加上 :端口号
即 www.douban.com:端口号
。
介绍一下路径的两种情况:相对路径和默认路径。
不是以斜杠 /
开头的路径表示相对路径,使用这种路径非常容易出错(至于为什么容易出错,我还不明白原理),总之要小心。例如:
gallery/topic/11234/?from=hot&sort=new
默认路径就是表示请求了服务器默认的页面,比如输入了https://www.douban.com就能打开豆瓣首页。
okhttp3的依赖库安装
在pom.xml添加依赖
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.1.0</version>
</dependency>
get请求-无参数
使用okhttp3完成页面请求需要三大步骤:
- 实例化
OkHttpClient
。
OkHttpClient okHttpClient = new OkHttpClient();
- 执行调用。
- 在执行调用之前,先实例化一个Request对像,用来定义请求的各种参数;
Request req = new Request.Builder().url(url).build();
- 然后构建调用对象
Call call = okHttpClient.newCall(req);
- 最后执行调用
call.execute();
返回的是一个结果对象。
- 如果调用失败可能会抛异常,所以必须抓取异常
- 获取返回字符串的内容:
call.execute().body().string();
上面其实是固定写法,例如有音乐排行榜的API,将调用的步骤其封装为一个方法getContent().,方便复用。
package com.youkeda.test.http;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Request;
import okhttp3.OkHttpClient;
public class GetPage {
/**
* 根据输入的url,读取页面内容并返回
*/
public String getContent(String url) {
//先实例化OkHttpClient
OkHttpClient okHttpClient = new OkHttpClient();
//实例化Request对象,定义参数
Request request = new Request.Builder().url(url).build();
//创建调用对象
Call call = okHttpClient.newCall(request);
// 返回结果字符串
String result = null;
try {
//执行得出结果
result = call.execute().body().string();
} catch(Exception e) {
}
return result;
}
public static void main(String[] args) {
GetPage getPage = new GetPage();
String url = "https://www.fastmock.site/mock/3d95acf3f26358ef032d8a23bfdead99/api/musicRankings";
String content = getPage.getContent(url) ;
System.out.println("API调用结果");
System.out.println(content);
}
}
get请求-有参数
post表单数据
post操作如提交数据到服务器进行增加、修改、删除等操作。post放在表单中提交,就需要构建一个 FormBody
表单对象,用于放置表单数据,其核心代码如下(这个也是固定写法):
Builder builder = new FormBody.Builder();
//设置数据
FormBody formBody = builder.build();
Request req = new Request.Builder().url(url).post(fromBody).build();
整体的步骤和请求API相似,但是在构建Request对象时,需要加一个 .post(formBody)
用来放入表单数据,这就是执行了post操作。例子如下(比较和get请求的不同,注意一下导入的类):
package com.youkeda.test.http;
import java.io.IOException;
import java.util.Map;
import java.util.HashMap;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Call;
import okhttp3.FormBody;
import okhttp3.FormBody.Builder;
/**
*这个例子是查询手机号的信息
*/
public class FormPoster {
public String postContent(String url, Map<String, String> formData) {
// okHttpClient 实例
OkHttpClient okHttpClient = new OkHttpClient();
//post方式提交的数据
Builder builder = new FormBody.Builder();
// 放入表单数据
for(String key:formData.keySet()){
builder.add(key,formData.get(key));
}
// 构建 FormBody 对象
FormBody formBody = builder.build();
// 指定 post 方式提交FormBody
Request request = new Request.Builder().url(url).post(formBody).build();
// 使用client去请求
Call call = okHttpClient.newCall(request);
// 返回结果字符串
String result = null;
try {
// 获得返回结果
result = call.execute().body().string();
} catch (IOException e) {
// 抓取异常
System.out.println("request " + url + " error . ");
e.printStackTrace();
}
return result;
}
public static void main(String[] args) {
String url = "http://tcc.taobao.com/cc/json/mobile_tel_segment.htm";
Map<String, String> formData = new HashMap();
formData.put("tel","18852075630" );
FormPoster poster = new FormPoster();
String content = poster.postContent(url, formData);
System.out.println("API调用结果");
System.out.println(content);
}
}
post JSON数据
和表单数据提交方法(使用post()方法)一样,只是参数不再使用 FormBody
对象,而是使用 RequestBody
。然后还需要添加一个依赖。点击看 FastJSON
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
看一下例子,比较和post表单提交的不同。
package com.youkeda.test.http;
import com.alibaba.fastjson.JSON;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import okhttp3.*;
public class JsonPoster {
// 定义提交数据的类型
public static final MediaType JSON_TYPE = MediaType.parse("application/json;charset=utf-8");
/**
* 向指定的 url 提交数据,以 json 的方式
*/
public String postContent(String url, Map<String, String> datas) {
// okHttpClient 实例
OkHttpClient okHttpClient = new OkHttpClient();
// 数据对象转换成 json 格式字符串
String param = JSON.toJSONString(datas);
//post方式提交的数据
RequestBody requestBody = RequestBody.create(JSON_TYPE,param);
Request request = new Request.Builder().url(url).post(requestBody).build();
// 使用client去请求
Call call = okHttpClient.newCall(request);
// 返回结果字符串
String result = null;
try {
// 获得返回结果
result = call.execute().body().string();
} catch (IOException e) {
// 抓取异常
System.out.println("request " + url + " error . ");
e.printStackTrace();
}
return result;
}
public static void main(String[] args) {
String url = "https://www.fastmock.site/mock/3d95acf3f26358ef032d8a23bfdead99/api/posts";
Map<String, String> datas = new HashMap();
datas.put("name", "张飞");
datas.put("secondName", "翼德");
JsonPoster jsonPoster = new JsonPoster();
String content = jsonPoster.postContent(url,datas);
System.out.println("API调用结果");
System.out.println(content);
}
}
总结一下提交JSON数据的步骤:
- 先将数据转换成
JSON
格式的数据 - 创建
RequestBody
实例,用create(类型,参数),类型在前面已经定义为静态变量,因为其类型就是application/json;charset=utf-8
; - 构建
Request
实例对象,调用.post(requestBody)
即表示使用JSON
的方式提交数据。