接口测试中如何利用cookies保持会话

使用cookies保持会话自己研究了下应该有两种方式:

1.保持会话的第一种方法:如果用的是同一个HttpClient且没去手动连接放掉client.getConnectionManager().shutdown(); 都不用去设置cookie的ClientPNames.COOKIE_POLICY。httpclient都是会保留cookie的

package com.wq;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

/**
 * 保持会话的第一种方法:如果用的是同一个HttpClient且没去手动连接放掉client.getConnectionManager().shutdown();
 * 都不用去设置cookie的ClientPNames.COOKIE_POLICY。httpclient都是会保留cookie的
 * @author Redick
 * @data 2017/4/24
 */

public class CookieManage {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Map<String, List<NameValuePair>> loginMap = new HashMap<String, List<NameValuePair>>();
        List<NameValuePair> loginList = new ArrayList<NameValuePair>();
        loginList.add(new BasicNameValuePair("username","yuechunhua"));
        loginList.add(new BasicNameValuePair("password","111111"));
        loginMap.put("http://eac.mgr.banksteel.com/login.htm", loginList);

        Map<String, List<NameValuePair>> actionMap = new HashMap<String, List<NameValuePair>>();
        List<NameValuePair> actionList = new ArrayList<NameValuePair>();
        actionList.add(new BasicNameValuePair("accountType","7"));
        actionMap.put("http://settlement.mgr.banksteel.com/settlement/account/list.htm", actionList);

        Map<String , String> returnMap = new HashMap<String, String>();
        returnMap=doPost(loginMap,actionMap);
        System.out.println(returnMap.toString());
        System.out.println("-----------------------------------");
    }

    public static Map<String, String> doPost(Map<String,List<NameValuePair>> loginMap,Map<String,List<NameValuePair>> actionMap){
        String loginURL ="";
        List<NameValuePair> loginNameValuePairs = null;
        String actionURL = "";
        List<NameValuePair> actionNameValuePairs = null;
        int actionStatusCode = 0;
        String actionResponseBody = "";
        Map<String, String> responseMap = new HashMap<String, String>();

        //获取登录的map中的url和参数
        for(String entry : loginMap.keySet()){
            loginURL = entry;
            loginNameValuePairs = loginMap.get(entry);
        }

        //创建一个HttpClientBuilder对象
        HttpClientBuilder httpClientBuilder = null;
        httpClientBuilder=HttpClientBuilder.create();
        //使用HttpClientBuilder对象创建httpClient对象
        CloseableHttpClient httpClient = httpClientBuilder.build();
        //调用getLoginCookies方法,传入httpClient对象,使得至始至终使用的是一个httpclient
        getLoginCookies(loginURL, loginNameValuePairs,httpClient);

        //此时已经获取到了cookies
        for(String actionEntry : actionMap.keySet()){
            actionURL = actionEntry;
            actionNameValuePairs = actionMap.get(actionEntry);
            //采用post方法
            HttpPost post = new HttpPost(actionURL);
            //设置body
            UrlEncodedFormEntity entity = null;
            try {
                entity=new UrlEncodedFormEntity(actionNameValuePairs,"UTF-8");
                post.setEntity(entity);
                //获取响应信息
                CloseableHttpResponse response = httpClient.execute(post);
                actionStatusCode = response.getStatusLine().getStatusCode();
                actionResponseBody = EntityUtils.toString(response.getEntity(), "UTF-8");
                //将获取的值对放入map中返回给调用方
                responseMap.put(actionURL, actionResponseBody);
                httpClient.close();
            }catch(IOException e){
                e.printStackTrace();
            }catch(Exception e){
                e.printStackTrace();
            }

        }
        return responseMap;
    }

    public static Map<String, String> getLoginCookies(String loginURL,List<NameValuePair> loginNameValuePairs,
            CloseableHttpClient httpClient){
        int statusCode =0;
        String retStr = null;
        Map<String,String> loginMap = new HashMap<String, String>();
        //采用post方法
        HttpPost post = new HttpPost(loginURL);
        //设置body
        UrlEncodedFormEntity entity = null;
        try {
            entity=new UrlEncodedFormEntity(loginNameValuePairs,"UTF-8");
            post.setEntity(entity);
            //获取响应信息
            CloseableHttpResponse response = httpClient.execute(post);
            statusCode = response.getStatusLine().getStatusCode();
            retStr = EntityUtils.toString(response.getEntity(), "UTF-8");
            //将获取的值对放入map中返回给调用方
            loginMap.put(loginURL, retStr);
        } catch (Exception e) {
            // TODO: handle exception
        }
        return loginMap;
    }

}
时间: 2024-09-16 01:43:35

接口测试中如何利用cookies保持会话的相关文章

webform中Session和Cookies对象的用法、登录保持

一 .webform中Session和Cookies对象的用法 1.Session: Session:在计算机中,尤其是在网络应用中,称为"会话控制".Session 对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序的 Web页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去.当用户请求来自应用程序的 Web 页时,如果该 用户还没有会话,则 Web 服务器将自动创建一个 Session 对象.当会话过期或被放弃后,服务器将终

从源码中浅析Android中如何利用attrs和styles定义控件

一直有个问题就是,Android中是如何通过布局文件,就能实现控件效果的不同呢?比如在布局文件中,我设置了一个TextView,给它设置了textColor,它就能够改变这个TextView的文本的颜色.这是如何做到的呢?我们分3个部分来看这个问题1.attrs.xml  2.styles.xml  3.看组件的源码. 1.attrs.xml: 我们知道Android的源码中有attrs.xml这个文件,这个文件实际上定义了所有的控件的属性,就是我们在布局文件中设置的各类属性 你可以找到attr

JSP中如何利用JS实现登录页面的跳转(JSP中如何利用JS实现跳转页面)

JSP中如何利用JS实现登录页面的跳转(JSP中如何利用JS实现跳转页面) 注:只是用到js中的setTimeout();具体使用方法:  setTimeout(函数名, 时间(毫秒)); setTimeout( ) 是属于 window 的 method, 但我们都是略去 window 这顶层物件名称, 这是用来设定一个时间, 时间到了, 就会执行一个指定的 method.setTimeout( ) 通常是与 function一起用. 样例: 1 <%@ page language="j

stata中xtivreg利用ivreg实现办法

Stata中计量方法的函数非常强大,但是强大的函数对于理解计量原理是不利的,因此能够将高层次函数化解为简单函数实现便于理解强大函数.对于工具变量的方法,由面板工具变量变为截面工具变量方法见下面的stata实现过程. mat Int=I(N*T) mat In=I(N) mat Jt=J(T,T,1) mat P=In#Jt mat Q=Int-P #生成转换矩阵,消除面板固定效应 mkmat Y,matrix(Y) mkmat z1 z2 z3 z4 z5 ...,matrix(Zmat) mk

Git中如何利用生成SSH个人公钥访问git仓库

Git中如何利用生成SSH个人公钥访问git仓库方法(这里以coding平台为例): 1. 获取 SSH 协议地址 在项目的代码页面点击 SSH 切换到 SSH 协议, 获得访问地址, 请使用这个地址来访问您的代码仓库,如下图: 2. 生成公钥 Mac/Linux 打开命令行终端, Windows 打开 Git Bash . 输入ssh-keygen -t rsa -C “[email protected]”,( 注册的邮箱),接下来点击enter键即可(也可以输入密码). $ssh-keyge

C#中如何利用操作符重载和转换操作符

原文:C#中如何利用操作符重载和转换操作符 操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成把两个整数加到一起的代码. 当编译器发现两个string类型的实例使用+操作符的时候,编译器会生成把两个字符串连接到一起的代码.那么编译器怎么就会知道这样做呢?如何进行操作符重载呢? 下面C#代码展示了一个类中如何进行操作符重载: namespace Do

在Linux中如何利用backtrace信息解决问题

在Linux中如何利用backtrace信息解决问题 一.导读 在程序调试过程中如果遇到程序崩溃死机的情况下我们通常多是通过出问题时的栈信息来找到出错的地方,这一点我们在调试一些高级编程语言程序的时候会深有体会,它们通常在出问题时会主动把出问题时的调用栈信息打印出来,比如我们在eclipse中调试java程序时. 当这些换到Linux上的C/C++环境时情况将变的稍微复杂一些,通常在这种情况下是通过拿到出问题时产生的core文件然后再利用gdb调试来看到出错时的程序栈信息,这是再好不过的了,但当

HttpClient在HTTP协议接口测试中的使用

TTP协议的接口测试中,使用到最多的就是GET请求与POST请求,其中POST请求有FORM参数提交请求与RAW请求,下面我将结合HttpClient来实现一下这三种形式: 一.GET请求: GET请求时,参数一般是写在链接上的,代码如下: 1 public void get(String url){ 2 CloseableHttpClient httpClient = null; 3 HttpGet httpGet = null; 4 try { 5 httpClient = HttpClie

在Windows Server 2012 R2的Hyper-V中设置虚拟机启用增强会话模式

在Windows Server 2012 R2的Hyper-V中,可以为虚拟机提供一种全新的连接方式,就是“增强会话模式”,它将让您更加方便的对虚拟机进行操作,比如分辨率的调整.设备的加载,最为方便的是在虚拟机和主机间的文件交换,就是我们平常最常用的操作复制和粘贴(不支持拖拽的方式). 虚拟机的增强会话模式默认并未开启,但开启操作也并不复杂: 使用条件: 虚拟机系统需要是Windows 8.1或Windows Server 2012 虚拟机中的Remote Desktop Service必须启用