OkHttp3网络编程代码总结
新Java网络编程
- Get请求
- Post表单数据/JSON数据
- 获取响应码/请求非文本内容
- 解析JSON数据
- headers(User-Agent、Referer、Host)
- 下载图片文件/解析excel
- cookie&session
Get请求
安装依赖库
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.1.0</version>
</dependency>
代码如下
package com.youkeda.http.two;import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;import java.io.IOException;public class getPage {public static String getContent(String url){//okHttpClient实例OkHttpClient okHttpClient=new OkHttpClient();//定义一个requestRequest request=new Request.Builder().url(url).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://www.weather.com.cn/data/sk/101210106.html";String content=getContent(url);System.out.println(content);}
}
Post表单数据/JSON数据
- 提交表达数据
package com.youkeda.http.two;import okhttp3.Call;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;public class FormPoster {public static String postComment(String url, Map<String,String> formData){OkHttpClient okHttpClient=new OkHttpClient();FormBody.Builder builder=new FormBody.Builder();for (String key : formData.keySet()) {builder.add(key,formData.get(key));}FormBody formBody= builder.build();Request request=new Request.Builder().url(url).post(formBody).build();Call call= okHttpClient.newCall(request);String result=null;try {result=call.execute().body().string();} catch (IOException e) {System.out.println("request "+result+" error.");e.printStackTrace();}return result;}public static void main(String[] args) {String url="http://tcc.taobao.com/cc/json/mobile_tel_segment.html";Map<String,String> formData=new HashMap<>();formData.put("tel","18952333672");String content=postComment(url,formData);System.out.println(content);}
}
- 提交JSON数据
<!-- 在下列地址查询最新的版本:https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version>
</dependency>
package com.youkeda.http.two;import com.alibaba.fastjson.JSON;
import okhttp3.*;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;public class FormPoster2 {public static final MediaType JSON_TYPE=MediaType.parse("application/json;charset=utf-8");public static String postContent(String url, Map<String,String> data){OkHttpClient okHttpClient=new OkHttpClient();String param= JSON.toJSONString(data);RequestBody requestBody=RequestBody.create(JSON_TYPE,param);Request request=new Request.Builder().url(url).post(requestBody).build();Call call= okHttpClient.newCall(request);String result=null;try {result=call.execute().body().string();} catch (IOException e) {System.out.println("request "+result+" error.");e.printStackTrace();}return result;}public static void main(String[] args) {String url="https://www.fastmock.site/mock/3d95acf3f26358ef032d8a23bfdead99/api/posts";Map<String,String> data=new HashMap<>();data.put("num","20190101");data.put("name","王陆");data.put("gender","男");data.put("faculty","灵剑派");data.put("discipline","无相剑骨");data.put("class","一年一班");data.put("startYear","2019");String content=postContent(url,data);System.out.println(content);}
}
获取响应码/请求非文本内容
- 获取状态码
package com.youkeda.http.three;import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;import java.io.IOException;public class GetPage {public static String getContent(String url){OkHttpClient okHttpClient=new OkHttpClient();Request request=new Request.Builder().url(url).build();Call call= okHttpClient.newCall(request);Response response=null;String result=null;int code=0;try {response = call.execute();result=response.body().string();code=response.code();System.out.println("状态吗:"+code);} catch (IOException e) {System.out.println("request "+url+ " error.");e.printStackTrace();}return result;}public static void main(String[] args) {String url="https://www.baidu.com/";String content=getContent(url);System.out.println(content);}
}
- 获取图片及Excel大小
package com.youkeda.http.three;import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;import java.io.IOException;public class ImageAsker {public static void getImage(String url){OkHttpClient okHttpClient=new OkHttpClient();Request request=new Request.Builder().url(url).build();Call call= okHttpClient.newCall(request);try {Response response= call.execute();byte[] bytes=response.body().bytes();System.out.println("图片的大小为:"+bytes.length+" 字节");} catch (IOException e) {System.out.println("request "+url+" error.");e.printStackTrace();}}public static void main(String[] args) {String url="https://style.youkeda.com/img/ham/course/py2/douban2.png";getImage(url);}
}
解析JSON数据
Map转化为JSON数据
String param= JSON.toJSONString(data);
JSON数据转化为Map
Map objectMap= JSON.parseObject(content,Map.class);
要会多级解析JSON数据
package com.youkeda.http.three;import com.alibaba.fastjson.JSON;
import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;import java.io.IOException;
import java.util.List;
import java.util.Map;public class ApiAsker3 {public static String getContent(String url){OkHttpClient okHttpClient=new OkHttpClient();Request request=new Request.Builder().url(url).build();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://c.y.qq.com/soso/fcgi-bin/client_search_cp?aggr=1&cr=1&flag_qc=0&p=1&n=30&w=西海情歌&format=json";String content=getContent(url);System.out.println(content);Map objectMap= JSON.parseObject(content,Map.class);Map data=(Map) objectMap.get("data");Map song=(Map) data.get("song");List list=(List) song.get("list");Map one=(Map) list.get(0);System.out.println(one.get("albumname"));}
}
headers(User-Agent、Referer、Host)
- User-Agent
在指定url发送请求的时候,告诉服务端,用户的浏览器类型、版本等数据,就认为这是一个浏览器请求的环境,就会给出响应 - Referer
如果像图片等只允许在本站内可访问的话,可以加Referer,模拟浏览器自动加Referer,设置原图片使用的网址 - Host
设置当前请求的域名,虽然url中有域名,但如果用了代理服务器或不写域名,而用ip地址进行访问的话,设置域名就非常有效了
package com.youkeda.http.four;import com.alibaba.fastjson.JSON;
import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;import java.io.IOException;
import java.util.List;
import java.util.Map;public class ApiAsker3 {public static String getContent(String url){OkHttpClient okHttpClient=new OkHttpClient();Request request=new Request.Builder().url(url).addHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1").addHeader("Referer","https://www.fastmock.site").addHeader("Host","www.fastmock.site").build();Call call=okHttpClient.newCall(request);String result=null;try {Response response= call.execute();result=response.body().string();int code= response.code();String url2=response.request().url().toString();System.out.println(code);System.out.println(url2);} 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/info/suggestion?from=web&format=json&word=刺心&third_type=0&client_type=0&version=2";// getContent(url);String content=getContent(url);System.out.println(content);Map resultMap=(Map) JSON.parseObject(content,Map.class);Map data=(Map) resultMap.get("data");List list=(List) data.get("song");for (int i = 0; i < list.size(); i++) {Map map=(Map) list.get(i);System.out.println(map.get("songname"));}}
}
下载图片文件/解析excel
- 写入文本文件
package com.youkeda.http.five;import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;import java.io.File;
import java.io.FileWriter;
import java.io.IOException;public class ApiAsker {public static String getContent(String url){OkHttpClient okHttpClient=new OkHttpClient();Request request=new Request.Builder().url(url).build();Call call= okHttpClient.newCall(request);String result=null;try {Response response=call.execute();result=response.body().string();} catch (IOException e) {System.out.println("request "+url+" error.");e.printStackTrace();}return result;}public static void main(String[] args) {String url="https://style.youkeda.com/img/ham/course/py2/h.txt";String content=getContent(url);System.out.println(content);File file=new File("h.txt");try {FileWriter fileWriter=new FileWriter(file.getName());fileWriter.write(content);fileWriter.close();} catch (IOException e) {e.printStackTrace();}}
}
- 写入二进制文件
package com.youkeda.http.five;import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class ExcelAsker {public static byte[] getContent(String url){OkHttpClient okHttpClient=new OkHttpClient();Request request=new Request.Builder().url(url).build();Call call= okHttpClient.newCall(request);byte[] result=null;try {Response response= call.execute();result=response.body().bytes();} catch (IOException e) {System.out.println("request "+url+" error.");e.printStackTrace();}return result;}public static void main(String[] args) {String url="https://style.youkeda.com/img/ham/course/py2/xzq_201907.xlsx";byte[] content=getContent(url);File file=new File("xzq_201907.xlsx");try {FileOutputStream fos=new FileOutputStream(file);fos.write(content);fos.flush();fos.close();} catch (IOException e) {e.printStackTrace();}System.out.println("下载成功");}
}
- 下载图片
package com.youkeda.http.five;import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class ImageAsker {public static byte[] getContent(String url){OkHttpClient okHttpClient=new OkHttpClient();Request request=new Request.Builder().url(url).addHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1").addHeader("Referer","http://photo.yupoo.com").addHeader("Host","photo.yupoo.com").build();Call call= okHttpClient.newCall(request);byte[] result=null;try {Response response= call.execute();result=response.body().bytes();} catch (IOException e) {e.printStackTrace();}return result;}public static void main(String[] args) {String url="http://photo.yupoo.com/vibius/GkRSowXr/medish.jpg";byte[] content=getContent(url);File file=new File("image.jpg");try {FileOutputStream fileOutputStream=new FileOutputStream(file);fileOutputStream.write(content);fileOutputStream.flush();fileOutputStream.close();} catch (IOException e) {e.printStackTrace();}System.out.println("Download complete");}}
- 解析excel
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.6</version>
</dependency>
package com.youkeda.http.five;import com.alibaba.excel.EasyExcel;
import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map;public class ExcelAsker2 {public static byte[] getContent(String url){OkHttpClient okHttpClient=new OkHttpClient();Request request=new Request.Builder().url(url).build();Call call= okHttpClient.newCall(request);byte[] result=null;try {Response response= call.execute();result=response.body().bytes();} catch (IOException e) {System.out.println("request "+url+" error.");e.printStackTrace();}return result;}public static void main(String[] args) {String url="https://style.youkeda.com/img/ham/course/py2/china-city-list.xlsx";byte[] content=getContent(url);File file=new File("china-city-list.xlsx");try {FileOutputStream fos=new FileOutputStream(file);fos.write(content);fos.flush();fos.close();} catch (IOException e) {e.printStackTrace();}System.out.println("下载成功");List<Map<Integer,String>> sheetDatas= EasyExcel.read("china-city-list.xlsx").sheet(0).doReadSync();for (Map<Integer, String> rowData : sheetDatas) {for (Integer index : rowData.keySet()) {String columnValue=rowData.get(index);System.out.print(columnValue+" ");}System.out.println();}}
}
cookie&session
- cookie
从浏览器中找到登录后的cookie,把cookie用工具写成Map格式,如图所示写上去
详情见优课达P2 新Java网络编程6.1cookie
- session
package com.youkeda.http.six;import okhttp3.*;
import org.jetbrains.annotations.NotNull;import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class PageLoginer {private static final OkHttpClient okHttpClient=new OkHttpClient.Builder().cookieJar(new CookieJar() {private final HashMap<String,List<Cookie>> cookieStare = new HashMap<>();@Overridepublic void saveFromResponse(@NotNull HttpUrl url, @NotNull List<Cookie> cookies) {cookieStare.put("mtime.com",cookies);}@NotNull@Overridepublic List<Cookie> loadForRequest(@NotNull HttpUrl httpUrl) {List<Cookie> cookies=cookieStare.get("mtime.com");return cookies!=null ? cookies: new ArrayList<>();}}).build();public String postContent(String url, Map<String,String> formData){FormBody.Builder builder=new FormBody.Builder();for (String key : formData.keySet()) {builder.add(key,formData.get(key));}FormBody formBody= builder.build();Request request=new Request.Builder().url(url).post(formBody).addHeader("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.62").addHeader("Referer","https://passport.mtime.com/").addHeader("Host","front-gateway.mtime.com").build();Call call= okHttpClient.newCall(request);String content=null;try {Response response= call.execute();content=response.body().string();} catch (IOException e) {e.printStackTrace();}return content;}public static void main(String[] args) {String url="https://front-gateway.mtime.com/user/user/login.api";Map<String,String> formData=new HashMap<>();formData.put("name","18952333672");formData.put("password","3a40af7a8174eb7e303102a399d5d1ac");String content=new PageLoginer().postContent(url,formData);System.out.println(content);}
}
- 复用session
先post后get
package com.youkeda.http.six;import okhttp3.*;
import org.jetbrains.annotations.NotNull;import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class PageLoginer2 {//用CookieJar实现cookie的存储,便于登录后请求其他URL可以调用private static final OkHttpClient okHttpClient=new OkHttpClient.Builder().cookieJar(new CookieJar() {private final HashMap<String,List<Cookie>> cookieStore=new HashMap<>();@Overridepublic void saveFromResponse(@NotNull HttpUrl url, @NotNull List<Cookie> cookies) {cookieStore.put("mtime.com",cookies);}@NotNull@Overridepublic List<Cookie> loadForRequest(@NotNull HttpUrl url) {List<Cookie> cookies=cookieStore.get("mtime.com");return cookies!=null?cookies:new ArrayList<>();}}).build();public String postContent(String url, Map<String,String> formData){FormBody.Builder builder=new FormBody.Builder();for (String key : formData.keySet()) {builder.add(key, formData.get(key));}FormBody formBody= builder.build();Request request=new Request.Builder().url(url).post(formBody).addHeader("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.62").addHeader("Referer","https://www.mtime.com/").addHeader("Host","front-gateway.mtime.com").build();return doExcute(request);}public String getContent(String url){Request request=new Request.Builder().url(url).addHeader("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.62").addHeader("Referer","http://my.mtime.com/").addHeader("Host","front-gateway.mtime.com").build();return doExcute(request);}public String doExcute(Request request){Call call= okHttpClient.newCall(request);String result=null;try {Response response= call.execute();result=response.body().string();} catch (IOException e) {e.printStackTrace();}return result;}public static void main(String[] args) {PageLoginer2 pageLoginer2=new PageLoginer2();String url="https://front-gateway.mtime.com/user/user/login.api";Map<String,String> resultMap=new HashMap<>();resultMap.put("name","18952333672");resultMap.put("password","3a40af7a8174eb7e303102a399d5d1ac");String content= pageLoginer2.postContent(url,resultMap);System.out.println(content);String url2="http://my.mtime.com/personal/personInfo";String content2= pageLoginer2.getContent(url2);System.out.println(content2);}
}
最终代码!!!
OkHttp3网络编程代码总结相关推荐
- 网络编程代码实例:多进程版
文章目录 前言 代码仓库 内容 代码(有详细注释) server.c client.c Makefile 结果 总结 参考资料 作者的话 前言 网络编程代码实例:多进程版. 代码仓库 yezhenin ...
- 网络编程—代码—TCP网络传输
一.TCP:用字符流传输信息 ------------------------------------------------------------------------------ [用字符流的 ...
- Linux网络编程中的几组类似功能的区别
1.bzero与memset char buff[1024]; memset(buff,0,sizeof(buff));bzero(buff, sizeof(buff)); struct sockad ...
- JAVA——网络编程
文章目录 1.InetAddress类的使用 1.1 实现网络通信需要解决的问题 1.2 网络通信的两个要素 1.3通信要素一:IP和端口号 1.3.1 IP的理解 1.3.2 InetAddress ...
- IO流,多线程,网络编程(4)JavaSE
1 IO流 Java如何操作电脑上的文件和文件夹?通过File类对它们进行操作 因为Java是面向对象的,所以最擅长的就是操作对象,将盘符上的文件/目录的各种信息进行了封装,封装为一个对象,我们程序就 ...
- 套接字编程-TCP网络编程
文章目录 套接字地址结构 通用套接字地址数据结构 以太网协议的套接字地址数据结构 Netlink协议套接字地址结构 TCP网络编程 套接字初始化socket() domain type protoco ...
- 【专栏必读】王道考研408计算机网络+湖科大教书匠计算机网络+网络编程万字笔记、题目题型总结、注意事项、目录导航和思维导图
王道考研复习指导下载(密码7281) 其他科目导航 [专栏必读]王道考研408计算机组成原理万字笔记(从学生角度辅助大家理解):各章节导航及思维导图 [专栏必读]王道考研408操作系统万字笔记.题目题 ...
- TCP/IP网络编程 学习笔记_1 --网络编程入门
前言:这个系列网络编程教程实例代码是在Xcode上运行的,MacOSX,是一个基于UNIX核心的系统,所以基于Linux的网络编程代码一般可以直接在Xcode上运行,如果要移植到Windows其实就只 ...
- 网络编程(三):Linux 网络IO模型、select、pool、epoll 内核设计
Linux网络IO模型 同步和异步,阻塞和非阻塞 同步和异步 关注的是调用方是否主动获取结果 同步: 同步的意思就是调用方需要主动等待结果的返回 异步: 异步的意思就是不需要主动等待结果的返回,而是通 ...
最新文章
- javascript实例
- 计算机如何改变沟通方式,雅思阅读模拟题:计算机改变沟通方式
- udp需要arp请求吗_当你随便浏览一个网页时,你知道背后做了多少工作吗?
- python相关背景及语言特点
- 格子箱被评选为12家最值得注意的亚洲初创科技公司之一
- 不记得 Git 命令? 懒人版 Git 值得拥有!
- PostgreSQL数据库配置网络访问
- SQL server 查询语句
- Ruby命令之gem操作
- CentOS下安装Docker-CE
- unity通过服务器地址下载文件
- 使用小丸工具箱进行极限视频压缩
- 超棒工具8个高质量图标搜索引擎
- 对Volterra级数公式的理解-1
- 数据库SQLite之嵌入式Linux实际网关项目使用初步
- B. Ternary Sequence
- KNIME + Python = 数据分析+报表全流程
- 宗镜录略讲——南怀瑾老师——系列6
- python数据分析用什么软件好_居民出行OD调查后数据分析应该用什么软件做?
- 相遇不易,5个高评分电脑软件,每一个都值得你安装