一般网络会给我们提供许多数据接口,我们的一些信息并不是我们本系统提供而是第三方给我们提供的,他们通常会给我们一个提供数据源的接口,访问这个接口可以获取相应的数据用于我们自己的应用中(WebService和现如今的json/xml通过http信息的传输模式都是如此)。 httpClient是一款优秀的基于https协议的网络发送http请求并获取相应的api,下面就来探讨一下如何使用httpClient进行get和post两种方式的http通信。 我们接下来要做的,就是提供一个数据接口,此数据接口提供整数计算服务,传入两个参数(要求是整数)和一个运算符参数,就可以得到最终的运算结果。如,传递param1=1,param2=2,operator='+',那么接口就会返回result:3。 开发环境:MyEclipse8.5,JDK1.7,Tomcat6.0 首先在MyEclipse中创建一个Web Project工程:
然后在工程的lib文件夹中加入httpClient所需的所有jar包(别忘记BuildPath):
首先我们创建一个Servlet,用来提供数据服务:
看一下Web.xml有没有给我们创建起这个Servlet服务:
下面我们开始编写这个Servlet,具体实现就是获取请求中的三个参数(两个运算值一个运算符号),然后进行计算然后返回结果:
package httpcall;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class TestHTTPServer extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("gbk"); PrintWriter out=response.getWriter(); String param1=request.getParameter("param1"); out.println("param1="+param1); String param2=request.getParameter("param2"); out.println("param2="+param2); String operator=request.getParameter("operator"); out.println(operator.equals(" ")?"operator=+":"operator="+operator); if(param1 == null || param1.equals("") || param1.length()<=0){ out.println("http call failed,参数param1不能为空,程序退出"); }else if(param2 == null || param2.equals("") || param2.length()<=0){ out.println("http call failed,参数param2不能为空,程序退出"); }else if(operator == null || operator.equals("") || operator.length()<=0){ out.println("http call failed,参数operator不能为空,程序退出"); }else{ out.println("---http call success---"); } int n=Integer.parseInt(param1); int m=Integer.parseInt(param2); if(operator.equals(" ")){ out.println("result:"+(n+m)); }else if(operator.equals("-")){ out.println("result:"+(n-m)); }else if(operator.equals("*")){ out.println("result:"+(n*m)); }else if(operator.equals("/")){ out.println("result:"+(n/m)); }else{ out.println("---unknow error---"); } out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); }}注意:“+”号通过URL传递到后台会被默认转义为空格“ ”,所以这里验证“+”号是用的是空格。
我们将该WebProject部署到tomcat中并运行起来:
在控制台可以看到tomcat运行的日志,当看到“Server startup in xxxx ms”的时候,服务器启动成功:
此时,在浏览器访问我们的服务,参数分别输入6、2和*,得到最终结果是6乘以2为12:
再测试一下加(+)、减(-)、除(/):
如果其中一个参数为空,得到的结果为:
好,我们的服务接口已经提供完毕了,接下来我们使用httpClient的get和post对这个http接口进行调用。
我们使用httpClinet分别编写了使用get与post方式进行http数据传输的方法,在main主方法中,对其进行了测试,分别使用get和post请求获取数据接口服务计算的结果:
package httpcall;import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;import org.apache.commons.httpclient.HttpClient;import org.apache.commons.httpclient.methods.GetMethod;import org.apache.commons.httpclient.methods.PostMethod;import org.apache.commons.httpclient.params.HttpMethodParams;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;public class HttpClientUtil { private static final Log log=LogFactory.getLog(HttpClientUtil.class); /** * get 方式 * @param param1 * @param param2 * @param opt * @return String * */ public static String getHttp(String param1,String param2,String opt){ String responseMsg=""; //1.构造HttpClient的实例 HttpClient httpClient=new HttpClient(); //用于测试的http接口的url String url="http://localhost:8081/HttpTest/httpServer?param1=" +param1+"¶m2="+param2+"&operator="+opt; //2.创建GetMethod的实例 GetMethod getMethod=new GetMethod(url); //使用系统的默认的恢复策略 getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler()); try { //3.执行getMethod,调用http接口 httpClient.executeMethod(getMethod); //4.读取内容 byte[] responseBody=getMethod.getResponseBody(); //5.处理返回的内容 responseMsg=new String(responseBody); log.info(responseMsg); } catch (Exception e) { e.printStackTrace(); }finally{ //6.释放连接 getMethod.releaseConnection(); } return responseMsg; } /** * post 方式 * @param param1 * @param param2 * @param opt * @return String * */ public static String postHttp(String param1,String param2,String opt){ String responseMsg=""; //1.构造HttpClient的实例 HttpClient httpClient=new HttpClient(); httpClient.getParams().setContentCharset("GBK"); String url="http://localhost:8081/HttpTest/httpServer"; //2.构造PostMethodd的实例 PostMethod postMethod=new PostMethod(url); //3.把参数值放入到PostMethod对象中 postMethod.addParameter("param1",param1); postMethod.addParameter("param2",param2); postMethod.addParameter("operator",opt); try { //4.执行postMethod,调用http接口 httpClient.executeMethod(postMethod);//200 //5.读取内容 responseMsg=postMethod.getResponseBodyAsString().trim(); //6.处理返回的内容 log.info(responseMsg); } catch (Exception e) { e.printStackTrace(); }finally{ //7.释放连接 postMethod.releaseConnection(); } return responseMsg; } /** * 测试的main方法 * @param args * */ public static void main(String[] args) { String param1="6"; String param2="2"; String opt="*"; System.out.println("get方式调用http接口\n"+getHttp(param1,param2,opt)); System.out.println("post方式调用http接口\n"+postHttp(param1,param2,opt)); }}运行结果:
证明我们成功使用httpClient访问了第三方数据接口,并获取了相应的数据。
下一次我们将httpClient应用到实战中,写一个完整的基于httpClient的服务应用。