您的位置:首页 > 理论基础 > 计算机网络

使用HttpURLConnection发送post和get请求

2013-06-14 16:38 281 查看
原文链接:http://blog.csdn.net/totogogo/article/details/1831588

 

使用HttpURLConnection发送post和get请求

1、http://blog.csdn.net/pandazxx/archive/2007/06/18/1657109.aspx

2、http://blog.csdn.net/pandazxx/archive/2007/06/20/1660008.aspx

但我们常常会碰到这样一种情况:

通过HttpURLConnection来模拟模拟用户登录Web服务器,服务器使用cookie进行用户认证。在模拟登录时,Post表单数据后可以正确登录(登陆成功时会response一个cookie,然后redirect到main page,不成功则redirect到login page),但是在使用HttpURLConnection再次连接服务器其他页面(或者即使是当前的response里是redirect的page)时,服务器都会认为是全新的一个Session。

解决方法有2步:

1. 调用HttpURLConnection (send post request to login page)的setInstanceFollowRedirects()方法,参数为false (这样不会去获取redirect page)

2. 获取HttpURLConnection send post request to login page的session id,然后在之后每一次的connection里都加上该session id

Example:

    String sessionId = "";  

    public static void sendLoginRequest() throws IOException {

       URL loginUrl = new URL("http://xxx");

       HttpURLConnection connection = (HttpURLConnection) loginUrl.openConnection();

 

 

       // Output to the connection. Default is

       // false, set to true because post

       // method must write something to the

       // connection

       // 设置是否向connection输出,因为这个是post请求,参数要放在

       // http正文内,因此需要设为true

       connection.setDoOutput(true);

       // Read from the connection. Default is true.

       connection.setDoInput(true);

       // Set the post method. Default is GET

       connection.setRequestMethod("POST");

       // Post cannot use caches

       // Post 请求不能使用缓存

       connection.setUseCaches(false);

 

       // This method takes effects to

       // every instances of this class.

       // URLConnection.setFollowRedirects是static函数,作用于所有的URLConnection对象。

       // connection.setFollowRedirects(true);

      

       // This methods only

       // takes effacts to this

       // instance.

       // URLConnection.setInstanceFollowRedirects是成员函数,仅作用于当前函数

       connection.setInstanceFollowRedirects(false);

      

       // Set the content type to urlencoded,

       // because we will write

       // some URL-encoded content to the

       // connection. Settings above must be set before connect!

       // 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的

       // 意思是正文是urlencoded编码过的form参数,下面我们可以看到我们对正文内容使用URLEncoder.encode

       // 进行编码

       connection.setRequestProperty("Content-Type",

              "application/x-www-form-urlencoded");

       // 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成,

       // 要注意的是connection.getOutputStream会隐含的进行connect。

       connection.connect();

 

       DataOutputStream out = new DataOutputStream(connection

              .getOutputStream());

 

         // 要传的参数

       String content = URLEncoder.encode("username", "UTF-8") + "="

              + URLEncoder.encode("XXX", "UTF-8");

       content += "&" + URLEncoder.encode("password", "UTF-8") + "="

              + URLEncoder.encode("XXXX", "UTF-8");

 

       // DataOutputStream.writeBytes将字符串中的16位的unicode字符以8位的字符形式写道流里面

       out.writeBytes(content);

 

       out.flush();

       out.close(); // flush and close

 

          //Get Session ID

       String key = "";

       if (connection != null) {

           for (int i = 1; (key = connection.getHeaderFieldKey(i)) != null; i++) {

              if (key.equalsIgnoreCase("set-cookie")) {

                  sessionId = connection.getHeaderField(key);

                  sessionId = sessionId.substring(0, sessionId.indexOf(";"));

              }

           }

       }     

       connection.disconnect();

    }

 

 然后之后每一次connection都要加上这个session id:

URL url = new URL("http:......");

HttpURLConnection connection = (HttpURLConnection)url.openConnection();

connection.setRequestProperty("Cookie",this.sessionId);

connection.connect();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: