java利用java.net.URLConnection发送HTTP请求的方法详解
一、前言
如何通过java发送http请求,通俗点讲,如何通过java(模拟浏览器)发送http请求。
java有原生的api可用于发送http请求,即java.net.url
、java.net.urlconnection
,这些api很好用、很常用,但不够简便;
所以,也流行有许多java http请求的framework,如,apache的httpclient。
目前项目主要用到java原生的方式,所以,这里主要介绍此方式。
二、运用原生java api发送简单的get请求、post请求步骤
1.通过统一资源定位器(java.net.url
)获取连接器(java.net.urlconnection
)
2.设置请求的参数
3.发送请求
4.以输入流的形式获取返回内容
5.关闭输入流
三、发送请求与接收响应流类 httprequestor
package me.http; import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstream; import java.io.inputstreamreader; import java.io.outputstream; import java.io.outputstreamwriter; import java.net.httpurlconnection; import java.net.inetsocketaddress; import java.net.proxy; import java.net.url; import java.net.urlconnection; import java.util.iterator; import java.util.map; public class httprequestor { private string charset = "utf-8"; private integer connecttimeout = null; private integer sockettimeout = null; private string proxyhost = null; private integer proxyport = null; /** * do get request * @param url * @return * @throws exception * @throws ioexception */ public string doget(string url) throws exception { url localurl = new url(url); urlconnection connection = this.openconnection(localurl); httpurlconnection httpurlconnection = (httpurlconnection)connection; httpurlconnection.setrequestproperty("accept-charset", charset); httpurlconnection.setrequestproperty("content-type", "application/x-www-form-urlencoded"); inputstream inputstream = null; inputstreamreader inputstreamreader = null; bufferedreader reader = null; stringbuffer resultbuffer = new stringbuffer(); string templine = null; //响应失败 if (httpurlconnection.getresponsecode() >= 300) { throw new exception("http request is not success, response code is " + httpurlconnection.getresponsecode()); } try { inputstream = httpurlconnection.getinputstream(); inputstreamreader = new inputstreamreader(inputstream); reader = new bufferedreader(inputstreamreader); while ((templine = reader.readline()) != null) { resultbuffer.append(templine); } } finally { if (reader != null) { reader.close(); } if (inputstreamreader != null) { inputstreamreader.close(); } if (inputstream != null) { inputstream.close(); } } return resultbuffer.tostring(); } /** * do post request * @param url * @param parametermap * @return * @throws exception */ public string dopost(string url, map parametermap) throws exception { /* translate parameter map to parameter date string */ stringbuffer parameterbuffer = new stringbuffer(); if (parametermap != null) { iterator iterator = parametermap.keyset().iterator(); string key = null; string value = null; while (iterator.hasnext()) { key = (string)iterator.next(); if (parametermap.get(key) != null) { value = (string)parametermap.get(key); } else { value = ""; } parameterbuffer.append(key).append("=").append(value); if (iterator.hasnext()) { parameterbuffer.append("&"); } } } system.out.println("post parameter : " + parameterbuffer.tostring()); url localurl = new url(url); urlconnection connection = this.openconnection(localurl); httpurlconnection httpurlconnection = (httpurlconnection)connection; httpurlconnection.setdooutput(true); httpurlconnection.setrequestmethod("post"); httpurlconnection.setrequestproperty("accept-charset", charset); httpurlconnection.setrequestproperty("content-type", "application/x-www-form-urlencoded"); httpurlconnection.setrequestproperty("content-length", string.valueof(parameterbuffer.length())); outputstream outputstream = null; outputstreamwriter outputstreamwriter = null; inputstream inputstream = null; inputstreamreader inputstreamreader = null; bufferedreader reader = null; stringbuffer resultbuffer = new stringbuffer(); string templine = null; try { outputstream = httpurlconnection.getoutputstream(); outputstreamwriter = new outputstreamwriter(outputstream); outputstreamwriter.write(parameterbuffer.tostring()); outputstreamwriter.flush(); //响应失败 if (httpurlconnection.getresponsecode() >= 300) { throw new exception("http request is not success, response code is " + httpurlconnection.getresponsecode()); } //接收响应流 inputstream = httpurlconnection.getinputstream(); inputstreamreader = new inputstreamreader(inputstream); reader = new bufferedreader(inputstreamreader); while ((templine = reader.readline()) != null) { resultbuffer.append(templine); } } finally { if (outputstreamwriter != null) { outputstreamwriter.close(); } if (outputstream != null) { outputstream.close(); } if (reader != null) { reader.close(); } if (inputstreamreader != null) { inputstreamreader.close(); } if (inputstream != null) { inputstream.close(); } } return resultbuffer.tostring(); } private urlconnection openconnection(url localurl) throws ioexception { urlconnection connection; if (proxyhost != null && proxyport != null) { proxy proxy = new proxy(proxy.type.http, new inetsocketaddress(proxyhost, proxyport)); connection = localurl.openconnection(proxy); } else { connection = localurl.openconnection(); } return connection; } /** * render request according setting * @param request */ private void renderrequest(urlconnection connection) { if (connecttimeout != null) { connection.setconnecttimeout(connecttimeout); } if (sockettimeout != null) { connection.setreadtimeout(sockettimeout); } } /* * getter & setter */ public integer getconnecttimeout() { return connecttimeout; } public void setconnecttimeout(integer connecttimeout) { this.connecttimeout = connecttimeout; } public integer getsockettimeout() { return sockettimeout; } public void setsockettimeout(integer sockettimeout) { this.sockettimeout = sockettimeout; } public string getproxyhost() { return proxyhost; } public void setproxyhost(string proxyhost) { this.proxyhost = proxyhost; } public integer getproxyport() { return proxyport; } public void setproxyport(integer proxyport) { this.proxyport = proxyport; } public string getcharset() { return charset; } public void setcharset(string charset) { this.charset = charset; } }
四、为测试方便,新建一个项目,并新建一个servlet,接收post请求并对httprequestor请求响应,发出响应流
loginservlet.java代码:此处使用了
注解: @webservlet("/loginservlet")
,也可以在web.xml配置servlet
package me.loginservlet; import java.io.ioexception; import javax.servlet.servletexception; import javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; /** * servlet implementation class loginservlet */ @webservlet("/loginservlet") public class loginservlet extends httpservlet { private static final long serialversionuid = 1l; /** * @see httpservlet#httpservlet() */ public loginservlet() { super(); // todo auto-generated constructor stub } /** * @see httpservlet#doget(httpservletrequest request, httpservletresponse response) */ protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { // todo auto-generated method stub system.out.println("111"); } /** * @see httpservlet#dopost(httpservletrequest request, httpservletresponse response) */ protected void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { // todo auto-generated method stub string username = request.getparameter("username"); string blog = request.getparameter("blog"); system.out.println(username); system.out.println(blog); response.setcontenttype("text/plain; charset=utf-8"); response.setcharacterencoding("utf-8"); //响应流 response.getwriter().write("it is ok!"); } }
五.测试类test.java
package me.http; import java.util.hashmap; import java.util.map; public class test { public static void main(string[] args) { /* post request */ map datamap = new hashmap(); datamap.put("username", "nick huang"); datamap.put("blog", "it"); try { system.out.println(new httprequestor().dopost("http://localhost:8081/testprogect2/loginservlet", datamap)); //system.out.println(new httprequestor().doget("http://localhost:8081/testprogect2/loginservlet")); } catch (exception e) { // todo auto-generated catch block e.printstacktrace(); } /* get request */ } }
1.接收post请求类loginservlet,控制台测试结果
2.httprequestor接收loginservlet返回的流
ok,完成
六.对于接收testprogect2项目中loginservlet.java类返回的流,在真实环境中可能是异步接收返回的流的,当一台机器a向另外一台机器b发送请求,b接收到a的信息,将信息处理后,需要将处理结果返回即响应返回给a,a会接收到b返回的信息
可以另外建一个servlet类httplistenerservlet.java来专门异步接收返回的信息
package me.http; import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstream; import java.io.inputstreamreader; import javax.servlet.servletexception; import javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; /** * servlet implementation class httplistenerservlet */ @webservlet("/httplistenerservlet") public class httplistenerservlet extends httpservlet { private static final long serialversionuid = 1l; /** * @see httpservlet#httpservlet() */ public httplistenerservlet() { super(); // todo auto-generated constructor stub } /** * @see httpservlet#doget(httpservletrequest request, httpservletresponse response) */ protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { // todo auto-generated method stub } /** * @see httpservlet#dopost(httpservletrequest request, httpservletresponse response) */ protected void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { // todo auto-generated method stub inputstream inputstream = null; inputstream = request.getinputstream(); inputstreamreader inputstreamreader = new inputstreamreader(inputstream); bufferedreader reader = new bufferedreader(inputstreamreader); string templine = null; stringbuffer resultbuffer=new stringbuffer(); while ((templine = reader.readline()) != null) { resultbuffer.append(templine); } system.out.println(resultbuffer.tostring()); } }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。