package com.study;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* @Author: Ein
* @DateTime: 2020/6/7 23:14
* @Description: HttpUrlConnection的doGet和doPost方法
*/
class MyHttpUrlConnection {
public static void main(String[] args) {
System.out.println("Hello World!");
}
/**
* HttpURLConnection使用Post请求方式
* @param url 请求目标地址
* @param parameter 请求参数,默认Json格式字符串,传对象需要序列化
* @return
*/
public static String doPost(String url,String parameter){
HttpURLConnection conn = null;
BufferedReader reader = null; //字符输入流
PrintWriter writer = null; //字符输出流
String content = null;
StringBuffer sbf = new StringBuffer();
try {
URL u = new URL(url); //创建URL对象
conn = (HttpURLConnection)u.openConnection();
//设置Post请求方式,默认为Get
conn.setRequestMethod("POST");
//设置服务器连接超时时间(milliseconds毫秒),超过该时间则报异常
conn.setConnectTimeout(6000);
//设置读取服务器资源时间,已经建立连接,并开始读取服务端资源。如果到了指定的时间,没有可能的数据被客户端读取,则报异常
conn.setReadTimeout(5000);
/**
* Post请求由于需要往服务区传输大量的数据,请求参数是在http的body里,因此需要设置setDoOutput(true)
* 而无论Get、Post总是要通过getInputStream()从服务端获得响应,所以setDoInput()默认是true
* setDoOutput()默认是false,需要手动设置为true,完了就可以调用getOutputStream()方法从服务器端获得字节输出流
* 总结,get请求的话这两个设置setDoInput和setDoOutput默认就行了,post请求需要setDoOutput(true),这个默认是false的
*/
conn.setDoInput(true);
conn.setDoOutput(true);
//Post请求禁止使用缓存 默认为true
conn.setUseCaches(false);
//自动执行HTTP重定向 默认为true
conn.setInstanceFollowRedirects(true);
/**
* Accept:text/xml;代表客户端希望接受的数据类型
* Content-Type:text/html 代表发送端(客户端|服务器)发送的实体数据的数据类型
* 设置请求头信息,可接收文档类型 *|* 所有
* 发送数据类型为编码格式UTF-8的Json字符串
*/
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("Content-type","application/json;charset=UTF-8");
//设定传送的内容类型是可序列化的java对象
//conn.setRequestProperty("Content-type", "application/x-java-serialized-object");
//设置请求头编码格式
conn.setRequestProperty("Accept-Charset", "UTF-8");
//Connection:Keep-Alive或 Connection:close,http请求的是否保持长连接,即链接是否复用,
//每次请求是复用已建立好的请求,还是重新建立一个新的请求
conn.setRequestProperty("Connection","Keep-Alive");
//设置发送请求的平台 Mozilla/5.0 (平台) 引擎版本 浏览器版本号
//conn.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36");
//带cookie的请求
//conn.setRequestProperty("Cookie", "JSESSIONID="+SessionId);
conn.connect();
//conn.getResponseCode(); 获取响应码
//获取输入流 getOutputStream会隐含的进行connect()
writer = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(),"UTF-8"));
writer.print(parameter); //参数写入
writer.flush();
//获取输出流
reader = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
while (null != (content=reader.readLine())){
sbf.append(content);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
//关闭流和连接
if (null != writer){
writer.close();
}
if (null != reader){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != conn){
conn.disconnect();
}
}
return sbf.toString();
}
/**
* HttpURLConnection使用Get请求方式
* @param url 参数拼接在url后
* @return
*/
public static String doGet(String url){
HttpURLConnection conn = null;
BufferedReader reader = null; //字符输入z
String content = null;
StringBuffer sbf = new StringBuffer();
URL u = null; //创建URL对象
try {
u = new URL(url);
conn = (HttpURLConnection)u.openConnection();
//设置Post请求方式,默认为Get
conn.setRequestMethod("GET");
//设置服务器连接超时时间(milliseconds毫秒),超过该时间则报异常
conn.setConnectTimeout(6000);
//设置读取服务器资源时间,已经建立连接,并开始读取服务端资源。如果到了指定的时间,没有可能的数据被客户端读取,则报异常
conn.setReadTimeout(5000);
conn.setDoInput(true);
conn.setDoOutput(false);
//禁止使用缓存 默认为true
conn.setUseCaches(false);
//自动执行HTTP重定向 默认为true
conn.setInstanceFollowRedirects(true);
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("Accept-Charset", "UTF-8");
conn.setRequestProperty("Connection","Keep-Alive");
//设置发送请求的平台 Mozilla/5.0 (平台) 引擎版本 浏览器版本号
//conn.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36");
//带cookie的请求
//conn.setRequestProperty("Cookie", "JSESSIONID="+SessionId);
conn.connect();
//获取输出流
reader = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
while (null != (content=reader.readLine())){
sbf.append(content);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
//关闭流和连接
if (null != reader){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != conn){
conn.disconnect();
}
}
return sbf.toString();
}
}