- *
- * Created on 2003-12-14 by Liudong
- */
- package http.demo;
- import java.io.IOException;
- import org.apache.commons.httpclient.*;
- import org.apache.commons.httpclient.methods.*;
- /** *//**
- * 最简单的HTTP客户端,用来演示通过GET或者POST方式访问某个页面
- * @author Liudong
- */
- public class SimpleClient ...{
- public static void main(String[] args) throws IOException
- ...{
- HttpClient client = new HttpClient();
- //设置代理服务器地址和端口
- //client.getHostConfiguration().setProxy("proxy_host_addr",proxy_port);
- //使用GET方法,如果服务器需要通过HTTPS连接,那只需要将下面URL中的http换成https
- HttpMethod method = new GetMethod("http://java.sun.com";);
- //使用POST方法
- //HttpMethod method = new PostMethod("http://java.sun.com";);
- client.executeMethod(method);
- //打印服务器返回的状态
- System.out.println(method.getStatusLine());
- //打印返回的信息
- System.out.println(method.getResponseBodyAsString());
- //释放连接
- method.releaseConnection();
- }
- }
- *
- * Created on 2003-12-7 by Liudong
- */
- package http.demo;
- import java.io.IOException;
- import org.apache.commons.httpclient.*;
- import org.apache.commons.httpclient.methods.*;
- /** *//**
- * 提交参数演示
- * 该程序连接到一个用于查询手机号码所属地的页面
- * 以便查询号码段1330227所在的省份以及城市
- * @author Liudong
- */
- public class SimpleHttpClient ...{
- public static void main(String[] args) throws IOException
- ...{
- HttpClient client = new HttpClient();
- client.getHostConfiguration().setHost("www.imobile.com.cn", 80, "http");
- HttpMethod method = getPostMethod();//使用POST方式提交数据
- client.executeMethod(method);
- //打印服务器返回的状态
- System.out.println(method.getStatusLine());
- //打印结果页面
- String response = new String(method.getResponseBodyAsString().getBytes("8859_1"));
- //打印返回的信息
- System.out.println(response);
- method.releaseConnection();
- }
- /** *//**
- * 使用GET方式提交数据
- * @return
- */
- private static HttpMethod getGetMethod()...{
- return new GetMethod("/simcard.php?simcard=1330227");
- }
- /** *//**
- * 使用POST方式提交数据
- * @return
- */
- private static HttpMethod getPostMethod()...{
- PostMethod post = new PostMethod("/simcard.php");
- NameValuePair simcard = new NameValuePair("simcard","1330227");
- post.setRequestBody(new NameValuePair[] ...{ simcard});
- return post;
- }
- }
- 在上面的例子中页面http://www.imobile.com.cn/simcard.php需要一个参数是simcard,这个参数值为手机号码段,即手机号码的前七位,服务器会返回提交的手机号码对应的省份、城市以及其他详细信息。GET的提交方法只需要在URL后加入参数信息,而POST则需要通过NameValuePair类来设置参数名称和它所对应的值
- 3. 处理页面重定向
- 在JSP/Servlet编程中response.sendRedirect方法就是使用HTTP协议中的重定向机制。它与JSP中的<jsp:forward …>的区别在于后者是在服务器中实现页面的跳转,也就是说应用容器加载了所要跳转的页面的内容并返回给客户端;而前者是返回一个状态码,这些状态码的可能值见下表,然后客户端读取需要跳转到的页面的URL并重新加载新的页面。就是这样一个过程,所以我们编程的时候就要通过HttpMethod.getStatusCode()方法判断返回值是否为下表中的某个值来判断是否需要跳转。如果已经确认需要进行页面跳转了,那么可以通过读取HTTP头中的location属性来获取新的地址。
- 状态码
- 对应HttpServletResponse的常量
- 详细描述
- 301
- SC_MOVED_PERMANENTLY
- 页面已经永久移到另外一个新地址
- 302
- SC_MOVED_TEMPORARILY
- 页面暂时移动到另外一个新的地址
- 303
- SC_SEE_OTHER
- 客户端请求的地址必须通过另外的URL来访问
- 307
- SC_TEMPORARY_REDIRECT
- 同SC_MOVED_TEMPORARILY
- 下面的代码片段演示如何处理页面的重定向
- client.executeMethod(post);
- System.out.println(post.getStatusLine().toString());
- post.releaseConnection();
- //检查是否重定向
- int statuscode = post.getStatusCode();
- if ((statuscode == HttpStatus.SC_MOVED_TEMPORARILY) ||
- (statuscode == HttpStatus.SC_MOVED_PERMANENTLY) ||
- (statuscode == HttpStatus.SC_SEE_OTHER) ||
- (statuscode == HttpStatus.SC_TEMPORARY_REDIRECT))
- ...{ //读取新的URL地址
- Header header = post.getResponseHeader("location");
- if (header != null) ...{
- String newuri = header.getValue();
- if ((newuri == null) || (newuri.equals("")))
- newuri = "/";
- GetMethod redirect = new GetMethod(newuri);
- client.executeMethod(redirect);
- System.out.println("Redirect:"+ redirect.getStatusLine().toString());
- redirect.releaseConnection();
- } else ...{
- System.out.println("Invalid redirect");
- } 我们可以自行编写两个JSP页面,其中一个页面用response.sendRedirect方法重定向到另外一个页面用来测试上面的例子。
- *
- * Created on 2003-12-7 by Liudong
- */
- package http.demo;
- import org.apache.commons.httpclient.*;
- import org.apache.commons.httpclient.cookie.*;
- import org.apache.commons.httpclient.methods.*;
- /** *//**
- * 用来演示登录表单的示例
- * @author Liudong
- */
- public class FormLoginDemo ...{
- static final String LOGON_SITE = "localhost";
- static final int LOGON_PORT = 8080;
- public static void main(String[] args) throws Exception...{
- HttpClient client = new HttpClient();
- client.getHostConfiguration().setHost(LOGON_SITE, LOGON_PORT);
- //模拟登录页面login.jsp->main.jsp
- PostMethod post = new PostMethod("/main.jsp");
- NameValuePair name = new NameValuePair("name", "ld");
- NameValuePair pass = new NameValuePair("password", "ld");
- post.setRequestBody(new NameValuePair[]...{name,pass});
- int status = client.executeMethod(post);
- System.out.println(post.getResponseBodyAsString());
- post.releaseConnection();
- //查看cookie信息
- CookieSpec cookiespec = CookiePolicy.getDefaultSpec();
- Cookie[] cookies = cookiespec.match(LOGON_SITE, LOGON_PORT, "/", false, client.getState().getCookies());
- if (cookies.length == ) ...{
- System.out.println("None");
- } else ...{
- for (int i = ; i < cookies.length; i++) ...{
- System.out.println(cookies[i].toString());
- }
- }
- //访问所需的页面main2.jsp
- GetMethod get = new GetMethod("/main2.jsp");
- client.executeMethod(get);
- System.out.println(get.getResponseBodyAsString());
- get.releaseConnection();
- }
- }
- import java.io.File;
- import java.io.FileInputStream;
- import org.apache.commons.httpclient.HttpClient;
- import org.apache.commons.httpclient.methods.EntityEnclosingMethod;
- import org.apache.commons.httpclient.methods.PostMethod;
- /** *//**
- * 用来演示提交XML格式数据的例子
- */
- public class PostXMLClient ...{
- public static void main(String[] args) throws Exception ...{
- File input = new File(“test.xml”);
- PostMethod post = new PostMethod(“http://localhost:8080/httpclient/xml.jsp”);
- // 设置请求的内容直接从文件中读取
- post.setRequestBody(new FileInputStream(input));
- if (input.length() < Integer.MAX_VALUE)
- post.setRequestContentLength(input.length());
- else
- post.setRequestContentLength(EntityEnclosingMethod.CONTENT_LENGTH_CHUNKED);
- // 指定请求内容的类型
- post.setRequestHeader("Content-type", "text/xml; charset=GBK");
- HttpClient httpclient = new HttpClient();
- int result = httpclient.executeMethod(post);
- System.out.println("Response status code: " + result);
- System.out.println("Response body: ");
- System.out.println(post.getResponseBodyAsString());
- post.releaseConnection();
- }
- }
- MultipartPostMethod filePost = new MultipartPostMethod(targetURL);
- filePost.addParameter("fileName", targetFilePath);
- HttpClient client = new HttpClient();
- //由于要上传的文件可能比较大,因此在此设置最大的连接超时时间
- client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
- int status = client.executeMethod(filePost);
- import org.apache.commons.httpclient.HttpClient;
- import org.apache.commons.httpclient.UsernamePasswordCredentials;
- import org.apache.commons.httpclient.methods.GetMethod;
- public class BasicAuthenticationExample ...{
- public BasicAuthenticationExample() ...{
- }
- public static void main(String[] args) throws Exception ...{
- HttpClient client = new HttpClient();
- client.getState().setCredentials(
- "www.verisign.com",
- "realm",
- new UsernamePasswordCredentials("username", "password")
- );
- GetMethod get = new GetMethod("https://www.verisign.com/products/index.html";);
- get.setDoAuthentication( true );
- int status = client.executeMethod( get );
- System.out.println(status+""+ get.getResponseBodyAsString());
- get.releaseConnection();
- }
- }
- MultiThreadedHttpConnectionManager connectionManager =
- new MultiThreadedHttpConnectionManager();
- HttpClient client = new HttpClient(connectionManager);