; ;

httpclient 中post请求重定向

背景:使用httpclient 的post请求进行登录,需要重定向登录,请求重定向后的地址

在httpclient中post请求不像get请求自己可以重定向,实现方式是 判断post请求返回码是否是302,如果是那么就获取传递过来的Location的地址,进行拼接,在进行一个get的请求

实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public Map<String, String> doPost(String url, Map<String, String> map, String charset) {
        HttpClient httpClient = null;
        HttpPost httpPost = null;
        String result = null;
        String domain = "http://user.hqygou.com";
        Map<String, String> returnmap = new HashMap<String, String>();
        try {
            httpClient = new SSLClient();
            httpPost = new HttpPost(url);
            // 设置参数
            List<NameValuePair> list = new ArrayList<NameValuePair>();
            Iterator iterator = map.entrySet().iterator();
            while (iterator.hasNext()) {
                Entry<String, String> elem = (Entry<String, String>) iterator.next();
                list.add(new BasicNameValuePair(elem.getKey(), elem.getValue()));
                System.out.println("请求的参数为:" + elem.getKey() + ":" + elem.getValue());
            }
            if (list.size() > 0) {
                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, charset);
                httpPost.setEntity(entity);
            }
            // 设置头部信息
            httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
            HttpResponse response = httpClient.execute(httpPost);
 
            if (response != null) {
                int code = response.getStatusLine().getStatusCode();
                System.out.println("返回的code为:" + code);
                if (code == 302) {  #判断post的请求返回码
                    Header[] hr = response.getAllHeaders();
                    for (int i = 0; i < hr.length; i++) {
                        Header header1 = hr[i];
                        System.out.println("头部的所有内容:" + header1);
                    }
                    String hearder = response.getHeaders("Location")[0].toString().split(":")[1].trim(); #获取返回码中头部中location 就是重定向的地址
                    String redirecturl = domain + hearder;  //需要和域名进行拼接
                    System.out.println("开始重定向,地址为:" + redirecturl);
                    cookies = response.getHeaders("Set-Cookie")[0].toString().split(":")[1].trim();
                    System.out.println("获取的cookie:" + cookies);
                    cookies = cookies.split(";")[0].trim();
                    httpGet(redirecturl, cookies);  #get请求,把获取的cookie进行一个拼接
                } else {
                    HttpEntity resEntity = response.getEntity();
                    if (resEntity != null) {
                        result = EntityUtils.toString(resEntity, charset);
                    }
                }
                returnmap.put("content", result);
                returnmap.put("cookies", cookies);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return returnmap;
    }

  运行入口

1
2
3
4
5
6
7
8
9
public static void main(String[] args) {
    test post = new test();
    String url = "http://xxx/login/index/checklogin";
    Map<String, String> map = new HashMap<String, String>();
    map.put("from", "xx");
    map.put("username", "xx");
    map.put("password", "xx");
    post.doPost(url, map, "UTF-8");
}

  

 注,后面这个200,是get请求时返回的内容,get请求可以查看另外一篇文章,http://www.cnblogs.com/chongyou/p/7808035.html 

posted @   做梦的人-  阅读(7668)  评论(1编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2015-11-09 ADB无线连接
点击右上角即可分享
微信分享提示