新Java网络编程
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();
//定义一个request
Request 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<>();
@Override
public void saveFromResponse(@NotNull HttpUrl url, @NotNull List<Cookie> cookies) {
cookieStare.put("mtime.com",cookies);
}
@NotNull
@Override
public 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<>();
@Override
public void saveFromResponse(@NotNull HttpUrl url, @NotNull List<Cookie> cookies) {
cookieStore.put("mtime.com",cookies);
}
@NotNull
@Override
public 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);
}
}
最终代码!!!