浅谈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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。