Java网络编程HTTP协议、简单API调用 - 图1

HTTP和HTTPS的区别

HTTP HTTPS
端口 80 443
数据传输方式 明文传输 加密传输
真假网站识别 很容易被复制 使用证书,很难被复制
浏览器显示区别 浏览器显示问好,提示不安全 浏览器显示小锁,提示安全
门槛 不需要证书 需要Gworg机构颁发证书,需要一定的成本
安全性 很容易被劫持,跳转到其他网站 加密安全,很难劫持,交易数据加密

URL

下图是对URL 例子的解释,可以知道这个地址没有端口,是因为其使用了默认端口,如果不是默认端口就需要在域名后面加上 :端口号www.douban.com:端口号
py2-1-2.png
介绍一下路径的两种情况:相对路径和默认路径。
不是以斜杠 / 开头的路径表示相对路径,使用这种路径非常容易出错(至于为什么容易出错,我还不明白原理),总之要小心。例如:

gallery/topic/11234/?from=hot&sort=new

默认路径就是表示请求了服务器默认的页面,比如输入了https://www.douban.com就能打开豆瓣首页。

okhttp3的依赖库安装

在pom.xml添加依赖

  1. <dependency>
  2. <groupId>com.squareup.okhttp3</groupId>
  3. <artifactId>okhttp</artifactId>
  4. <version>4.1.0</version>
  5. </dependency>

get请求-无参数

使用okhttp3完成页面请求需要三大步骤:

  1. 实例化 OkHttpClient

OkHttpClient okHttpClient = new OkHttpClient();

  1. 执行调用。
  • 在执行调用之前,先实例化一个Request对像,用来定义请求的各种参数;

Request req = new Request.Builder().url(url).build();

  • 然后构建调用对象

Call call = okHttpClient.newCall(req);

  • 最后执行调用

call.execute(); 返回的是一个结果对象。

  • 如果调用失败可能会抛异常,所以必须抓取异常
  1. 获取返回字符串的内容: call.execute().body().string();

上面其实是固定写法,例如有音乐排行榜的API,将调用的步骤其封装为一个方法getContent().,方便复用。

  1. package com.youkeda.test.http;
  2. import java.io.IOException;
  3. import okhttp3.Call;
  4. import okhttp3.Request;
  5. import okhttp3.OkHttpClient;
  6. public class GetPage {
  7. /**
  8. * 根据输入的url,读取页面内容并返回
  9. */
  10. public String getContent(String url) {
  11. //先实例化OkHttpClient
  12. OkHttpClient okHttpClient = new OkHttpClient();
  13. //实例化Request对象,定义参数
  14. Request request = new Request.Builder().url(url).build();
  15. //创建调用对象
  16. Call call = okHttpClient.newCall(request);
  17. // 返回结果字符串
  18. String result = null;
  19. try {
  20. //执行得出结果
  21. result = call.execute().body().string();
  22. } catch(Exception e) {
  23. }
  24. return result;
  25. }
  26. public static void main(String[] args) {
  27. GetPage getPage = new GetPage();
  28. String url = "https://www.fastmock.site/mock/3d95acf3f26358ef032d8a23bfdead99/api/musicRankings";
  29. String content = getPage.getContent(url) ;
  30. System.out.println("API调用结果");
  31. System.out.println(content);
  32. }
  33. }

get请求-有参数

和无参数的调用方法一样,只是URL带有参数。

post表单数据

post操作如提交数据到服务器进行增加、修改、删除等操作。post放在表单中提交,就需要构建一个 FormBody 表单对象,用于放置表单数据,其核心代码如下(这个也是固定写法):

  1. Builder builder = new FormBody.Builder();
  2. //设置数据
  3. FormBody formBody = builder.build();
  4. Request req = new Request.Builder().url(url).post(fromBody).build();

整体的步骤和请求API相似,但是在构建Request对象时,需要加一个 .post(formBody) 用来放入表单数据,这就是执行了post操作。例子如下(比较和get请求的不同,注意一下导入的类):

  1. package com.youkeda.test.http;
  2. import java.io.IOException;
  3. import java.util.Map;
  4. import java.util.HashMap;
  5. import okhttp3.OkHttpClient;
  6. import okhttp3.Request;
  7. import okhttp3.Call;
  8. import okhttp3.FormBody;
  9. import okhttp3.FormBody.Builder;
  10. /**
  11. *这个例子是查询手机号的信息
  12. */
  13. public class FormPoster {
  14. public String postContent(String url, Map<String, String> formData) {
  15. // okHttpClient 实例
  16. OkHttpClient okHttpClient = new OkHttpClient();
  17. //post方式提交的数据
  18. Builder builder = new FormBody.Builder();
  19. // 放入表单数据
  20. for(String key:formData.keySet()){
  21. builder.add(key,formData.get(key));
  22. }
  23. // 构建 FormBody 对象
  24. FormBody formBody = builder.build();
  25. // 指定 post 方式提交FormBody
  26. Request request = new Request.Builder().url(url).post(formBody).build();
  27. // 使用client去请求
  28. Call call = okHttpClient.newCall(request);
  29. // 返回结果字符串
  30. String result = null;
  31. try {
  32. // 获得返回结果
  33. result = call.execute().body().string();
  34. } catch (IOException e) {
  35. // 抓取异常
  36. System.out.println("request " + url + " error . ");
  37. e.printStackTrace();
  38. }
  39. return result;
  40. }
  41. public static void main(String[] args) {
  42. String url = "http://tcc.taobao.com/cc/json/mobile_tel_segment.htm";
  43. Map<String, String> formData = new HashMap();
  44. formData.put("tel","18852075630" );
  45. FormPoster poster = new FormPoster();
  46. String content = poster.postContent(url, formData);
  47. System.out.println("API调用结果");
  48. System.out.println(content);
  49. }
  50. }

post JSON数据

和表单数据提交方法(使用post()方法)一样,只是参数不再使用 FormBody 对象,而是使用 RequestBody 。然后还需要添加一个依赖。点击看 FastJSON

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>fastjson</artifactId>
  4. <version>1.2.62</version>
  5. </dependency>

看一下例子,比较和post表单提交的不同。

  1. package com.youkeda.test.http;
  2. import com.alibaba.fastjson.JSON;
  3. import java.io.IOException;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6. import okhttp3.*;
  7. public class JsonPoster {
  8. // 定义提交数据的类型
  9. public static final MediaType JSON_TYPE = MediaType.parse("application/json;charset=utf-8");
  10. /**
  11. * 向指定的 url 提交数据,以 json 的方式
  12. */
  13. public String postContent(String url, Map<String, String> datas) {
  14. // okHttpClient 实例
  15. OkHttpClient okHttpClient = new OkHttpClient();
  16. // 数据对象转换成 json 格式字符串
  17. String param = JSON.toJSONString(datas);
  18. //post方式提交的数据
  19. RequestBody requestBody = RequestBody.create(JSON_TYPE,param);
  20. Request request = new Request.Builder().url(url).post(requestBody).build();
  21. // 使用client去请求
  22. Call call = okHttpClient.newCall(request);
  23. // 返回结果字符串
  24. String result = null;
  25. try {
  26. // 获得返回结果
  27. result = call.execute().body().string();
  28. } catch (IOException e) {
  29. // 抓取异常
  30. System.out.println("request " + url + " error . ");
  31. e.printStackTrace();
  32. }
  33. return result;
  34. }
  35. public static void main(String[] args) {
  36. String url = "https://www.fastmock.site/mock/3d95acf3f26358ef032d8a23bfdead99/api/posts";
  37. Map<String, String> datas = new HashMap();
  38. datas.put("name", "张飞");
  39. datas.put("secondName", "翼德");
  40. JsonPoster jsonPoster = new JsonPoster();
  41. String content = jsonPoster.postContent(url,datas);
  42. System.out.println("API调用结果");
  43. System.out.println(content);
  44. }
  45. }

总结一下提交JSON数据的步骤:

  1. 先将数据转换成 JSON 格式的数据
  2. 创建 RequestBody 实例,用create(类型,参数),类型在前面已经定义为静态变量,因为其类型就是 application/json;charset=utf-8 ;
  3. 构建 Request 实例对象,调用 .post(requestBody) 即表示使用 JSON 的方式提交数据。