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) {//先实例化OkHttpClientOkHttpClient 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 方式提交FormBodyRequest 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的方式提交数据。

