浅谈Java HttpURLConnection请求方式
一)URL代理请求
该方式请求有两种代理方式。
方式一:使用该方式代理之后,之后的所有接口都会使用代理请求
//对http开启全局代理
System.setProperty("http.proxyHost","192.168.1.1");
System.setProperty("http.proxyPort","80");
//对https开启全局代理
System.setProperty("https.proxyHost","192.168.1.1");
System.setProperty("https.proxyPort","80");
方式二:适用于只有部分接口需要代理请求场景
Proxyproxy=newProxy(Type.HTTP,newInetSocketAddress("192.168.1.1",80));
HttpURLConnectionconn=null;
try{
URLurl=newURL("http://localhost:8080/ouyangjun");
conn=(HttpURLConnection)url.openConnection(proxy);
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
二)无参数GET请求
方法解析:
HttpGetUtils.doGetNoParameters(StringrequestURL,StringproxyHost,IntegerproxyPort);
requestURL:请求路径,必填
proxyHost:代理IP,即服务器代理地址,可为null
proxyPort:代理端口,可为null
说明:一般本地测试几乎是不会用代理的,只有服务器用代理方式请求比较多。
实现源码:
packagecom.ouyangjun.wechat.utils;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.net.HttpURLConnection;
importjava.net.InetSocketAddress;
importjava.net.MalformedURLException;
importjava.net.Proxy;
importjava.net.Proxy.Type;
importjava.net.URL;
/**
*http请求工具类
*@authorouyangjun
*/
publicclassHttpGetUtils{
/**
*httpget请求,不带参数
*@paramrequestURL
*@parammethod
*@return
*/
publicstaticStringdoGetNoParameters(StringrequestURL,StringproxyHost,IntegerproxyPort){
//记录信息
StringBufferbuffer=newStringBuffer();
HttpURLConnectionconn=null;
try{
URLurl=newURL(requestURL);
//判断是否需要代理模式请求http
if(proxyHost!=null&&proxyPort!=null){
//如果是本机自己测试,不需要代理请求,但发到服务器上的时候需要代理请求
//对http开启全局代理
//System.setProperty("http.proxyHost",proxyHost);
//System.setProperty("http.proxyPort",proxyPort);
//对https开启全局代理
//System.setProperty("https.proxyHost",proxyHost);
//System.setProperty("https.proxyPort",proxyPort);
//代理访问http请求
Proxyproxy=newProxy(Type.HTTP,newInetSocketAddress(proxyHost,proxyPort));
conn=(HttpURLConnection)url.openConnection(proxy);
}else{
//原生访问http请求,未代理请求
conn=(HttpURLConnection)url.openConnection();
}
//设置请求的属性
conn.setDoOutput(true);//是否可以输出
conn.setRequestMethod("GET");//请求方式,只包含"GET","POST","HEAD","OPTIONS","PUT","DELETE","TRACE"六种
conn.setConnectTimeout(60000);//最高超时时间
conn.setReadTimeout(60000);//最高读取时间
conn.setConnectTimeout(60000);//最高连接时间
//读取数据
InputStreamis=null;
InputStreamReaderinputReader=null;
BufferedReaderreader=null;
try{
is=conn.getInputStream();
inputReader=newInputStreamReader(is,"UTF-8");
reader=newBufferedReader(inputReader);
Stringtemp;
while((temp=reader.readLine())!=null){
buffer.append(temp);
}
}catch(Exceptione){
System.out.println("HttpGetUtilsdoGetNoParameterserror:"+e);
}finally{
try{
if(reader!=null){
reader.close();
}
if(inputReader!=null){
inputReader.close();
}
if(is!=null){
is.close();
}
}catch(IOExceptione){
System.out.println("HttpGetUtilsdoGetNoParameterserror:"+e);
}
}
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}finally{
//当http连接空闲时,释放资源
if(conn!=null){
conn.disconnect();
}
}
//返回信息
returnbuffer.length()==0?"":buffer.toString();
}
}
三)带参数POST请求
方法解析:
HttpPostUtils.doPost(StringrequestURL,Stringparams,StringproxyHost,IntegerproxyPort);
requestURL:请求路径,必填
params:请求参数,必填,数据格式为JSON
proxyHost:代理IP,即服务器代理地址,可为null
proxyPort:代理端口,可为null
说明:一般本地测试几乎是不会用代理的,只有服务器用代理方式请求比较多。
实现源码:
packagecom.ouyangjun.wechat.utils;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.OutputStream;
importjava.net.HttpURLConnection;
importjava.net.InetSocketAddress;
importjava.net.MalformedURLException;
importjava.net.Proxy;
importjava.net.Proxy.Type;
importjava.net.URL;
/**
*http请求工具类
*@authorouyangjun
*/
publicclassHttpPostUtils{
/**
*httppost请求,带参数
*@paramrequestURL
*@paramparams
*@return
*/
publicstaticStringdoPost(StringrequestURL,Stringparams,StringproxyHost,IntegerproxyPort){
//记录信息
StringBufferbuffer=newStringBuffer();
HttpURLConnectionconn=null;
try{
URLurl=newURL(requestURL);
//判断是否需要代理模式请求http
if(proxyHost!=null&&proxyPort!=null){
//如果是本机自己测试,不需要代理请求,但发到服务器上的时候需要代理请求
//对http开启全局代理
//System.setProperty("http.proxyHost",proxyHost);
//System.setProperty("http.proxyPort",proxyPort);
//对https开启全局代理
//System.setProperty("https.proxyHost",proxyHost);
//System.setProperty("https.proxyPort",proxyPort);
//代理访问http请求
Proxyproxy=newProxy(Type.HTTP,newInetSocketAddress(proxyHost,proxyPort));
conn=(HttpURLConnection)url.openConnection(proxy);
}else{
//原生访问http请求,未代理请求
conn=(HttpURLConnection)url.openConnection();
}
//设置请求的属性
conn.setDoOutput(true);//是否可以输出
conn.setRequestMethod("POST");//请求方式,只包含"GET","POST","HEAD","OPTIONS","PUT","DELETE","TRACE"六种
conn.setConnectTimeout(60000);//最高超时时间
conn.setReadTimeout(60000);//最高读取时间
conn.setConnectTimeout(60000);//最高连接时间
conn.setDoInput(true);//是否可以输入
if(params!=null){
//设置参数为json格式
conn.setRequestProperty("Content-type","application/json");
//写入参数信息
OutputStreamos=conn.getOutputStream();
try{
os.write(params.getBytes("UTF-8"));
}catch(Exceptione){
System.out.println("HttpPostUtilsdoPosterror:"+e);
}finally{
try{
if(os!=null){
os.close();
}
}catch(IOExceptione){
System.out.println("HttpPostUtilsdoPosterror:"+e);
}
}
}
//读取数据
InputStreamis=null;
InputStreamReaderinputReader=null;
BufferedReaderreader=null;
try{
is=conn.getInputStream();
inputReader=newInputStreamReader(is,"UTF-8");
reader=newBufferedReader(inputReader);
Stringtemp;
while((temp=reader.readLine())!=null){
buffer.append(temp);
}
}catch(Exceptione){
System.out.println("HttpPostUtilsdoPosterror:"+e);
}finally{
try{
if(reader!=null){
reader.close();
}
if(inputReader!=null){
inputReader.close();
}
if(is!=null){
is.close();
}
}catch(IOExceptione){
System.out.println("HttpPostUtilsdoPosterror:"+e);
}
}
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}finally{
//当http连接空闲时,释放资源
if(conn!=null){
conn.disconnect();
}
}
//返回信息
returnbuffer.length()==0?"":buffer.toString();
}
}
四)Http模拟测试
本案例是使用了微信公众号两个接口作为了测试案例。
appID和appsecret需要申请了微信公众号才能获取到。
packagecom.ouyangjun.wechat.test;
importcom.ouyangjun.wechat.utils.HttpGetUtils;
importcom.ouyangjun.wechat.utils.HttpPostUtils;
publicclassTestHttp{
privatefinalstaticStringWECHAT_APPID="";//appid,需申请微信公众号才能拿到
privatefinalstaticStringWECHAT_APPSECRET="";//appsecret,需申请微信公众号才能拿到
publicstaticvoidmain(String[]args){
//获取微信公众号token
getWeChatToken();
//修改用户备注信息
Stringtoken="31_1uw5em_HrgkfXok6drZkDZLKsBfbNJr9WTdzdkc_Tdat-9tpOezWsNI6tBMkyPe_zDHjErIS1r0dgnTpT5bfKXcASShJVhPqumivRP21PvQe3Cbfztgs1IL2Jpy7kw3Y09bC1urlWzDA52mtEDGcADAVUX";
Stringopenid="oCh4n0-6JKQpJgBOPA5tytoYb0VY";
updateUserRemark(token,openid);
}
/**
*根据appid和appsecret获取微信token,返回json格式数据,需自行解析
*@return
*/
publicstaticStringgetWeChatToken(){
StringrequestURL="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+WECHAT_APPID+"&secret="+WECHAT_APPSECRET;
Stringtoken=HttpGetUtils.doGetNoParameters(requestURL,null,null);
System.out.println("wechattoken:"+token);
returntoken;
}
/**
*修改用户备注,返回json格式数据,需自行解析
*@paramtoken
*@paramopenid
*@return
*/
publicstaticStringupdateUserRemark(Stringtoken,Stringopenid){
StringreuqestURL="https://api.weixin.qq.com/cgi-bin/user/info/updateremark?access_token="+token;
//封装json参数
StringjsonParams="{\"openid\":\""+openid+"\",\"remark\":\"oysept\"}";
Stringmsg=HttpPostUtils.doPost(reuqestURL,jsonParams,null,null);
System.out.println("msg:"+msg);
returnjsonParams;
}
}
补充知识:JavaHttpURLConnectionpostsetparams设置请求参数的三种方法实践总结
我就废话不多说了,大家还是直接看代码吧~
/** *thefirstwaytosetparams *OutputStream */ byte[]bytesParams=paramsStr.getBytes(); //发送请求params参数 OutputStreamoutStream=connection.getOutputStream(); outStream.write(bytesParams); outStream.flush(); /** *thesecondwaytosetparams *PrintWriter */ PrintWriterprintWriter=newPrintWriter(connection.getOutputStream()); //PrintWriterprintWriter=newPrintWriter(newOutputStreamWriter(connection.getOutputStream(),"UTF-8")); //发送请求params参数 printWriter.write(paramsStr); printWriter.flush(); /** *thethirdwaytosetparams *OutputStreamWriter */ OutputStreamWriterout=newOutputStreamWriter( connection.getOutputStream(),"UTF-8"); //发送请求params参数 out.write(paramsStr); out.flush();
demo:
/**
*@parampathurl
*@paramparamsStr
*@return
*/
privatestaticStringpostUrlBackStr(Stringpathurl,StringparamsStr){
StringbackStr="";
InputStreaminputStream=null;
ByteArrayOutputStreambaos=null;
try{
URLurl=newURL(pathurl);
HttpURLConnectionconnection=(HttpURLConnection)url.openConnection();
//设定请求的方法为"POST",默认是GET
connection.setRequestMethod("POST");
connection.setConnectTimeout(50000);
connection.setReadTimeout(50000);
//User-AgentIE11的标识
connection.setRequestProperty("User-Agent","Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.3;Trident/7.0;rv:11.0)likeGecko");
connection.setRequestProperty("Accept-Language","zh-CN");
connection.setRequestProperty("Connection","Keep-Alive");
connection.setRequestProperty("Charset","UTF-8");
/**
*当我们要获取我们请求的http地址访问的数据时就是使用connection.getInputStream().read()方式时我们就需要setDoInput(true),
根据api文档我们可知doInput默认就是为true。我们可以不用手动设置了,如果不需要读取输入流的话那就setDoInput(false)。
当我们要采用非get请求给一个http网络地址传参就是使用connection.getOutputStream().write()方法时我们就需要setDoOutput(true),默认是false
*/
//设置是否从httpUrlConnection读入,默认情况下是true;
connection.setDoInput(true);
//设置是否向httpUrlConnection输出,如果是post请求,参数要放在http正文内,因此需要设为true,默认是false;
connection.setDoOutput(true);
connection.setUseCaches(false);
/**
*thefirstwaytosetparams
*OutputStream
*/
/*byte[]bytesParams=paramsStr.getBytes();
//发送请求params参数
OutputStreamoutStream=connection.getOutputStream();
outStream.write(bytesParams);
outStream.flush();
*/
/**
*thesecondwaytosetparams
*PrintWriter
*/
/*PrintWriterprintWriter=newPrintWriter(connection.getOutputStream());
//PrintWriterprintWriter=newPrintWriter(newOutputStreamWriter(connection.getOutputStream(),"UTF-8"));
//发送请求params参数
printWriter.write(paramsStr);
printWriter.flush();*/
/**
*thethirdwaytosetparams
*OutputStreamWriter
*/
OutputStreamWriterout=newOutputStreamWriter(
connection.getOutputStream(),"UTF-8");
//发送请求params参数
out.write(paramsStr);
out.flush();
connection.connect();//
intcontentLength=connection.getContentLength();
if(connection.getResponseCode()==200){
inputStream=connection.getInputStream();//会隐式调用connect()
baos=newByteArrayOutputStream();
intreadLen;
byte[]bytes=newbyte[1024];
while((readLen=inputStream.read(bytes))!=-1){
baos.write(bytes,0,readLen);
}
backStr=baos.toString();
Log.i(TAG,"backStr:"+backStr);
}else{
Log.e(TAG,"请求失败code:"+connection.getResponseCode());
}
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}finally{
try{
if(baos!=null){
baos.close();
}
if(inputStream!=null){
inputStream.close();
}
}catch(IOExceptione){
e.printStackTrace();
}
}
returnbackStr;
}
以上这篇浅谈JavaHttpURLConnection请求方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。