接口测试学习入门(1)--前期知识储备

接口测试前必需知识了解:
1.接口测试的原理:

无论用那种测试方法,接口测试的原理是通过测试程序模拟客户端向服务器发送请求报文,服务器接收请求报文后对相应的报文做出处理然后再把应答报文发送给客户端,客户端接收应答报文这一个过程。

2.前期知识储备
2.1 http知识了解(详见 http://www.blogjava.net/zjusuyong/articles/304788.html 写的很棒!)

http端口号 80,不输入默认就是, https端口号 443,基于SSL

https加密原理:

需要基本了解的:
(1)请求头
编程中需要来设置的:
post.setHeader("User-Agent", "Chrome");
post.setHeader("Referer", "passport.36kr.com");
String XSRFTOKEN = responseCookie.getXSRFTOKEN(response);
相关介绍:
Referer:来访者的地址,即上一个页面的地址,程序中一般设置为host,防止跨域
User-Agent:是一种向访问网站提供你所使用的浏览器类型、操作系统及版本、CPU 类型、浏览器渲染引擎、浏览器语言、浏览器插件等信息的标识。
XSRFTOKEN:为了防范CSRF,需要做的是不要将http(s)请求的参数放在get中,而应该放在post/put/delete中。然后在页面上加上再一个变化的token(每次刷新页面后都会改变,不同于之前的token),请求服务器时都验证该token,正常的client端,在发送request的时候会包含这一项,和服务器端对上号,就起到了验证的作用。对于特定的页面需要进行此处的验证。
(2)响应头
response.getFirstHeader("set-cookie"));//输出cookie的头部
response.getLastHeader("set-cookie"));//输出cookie的尾部
Header[] head=response.getAllHeaders("set-cookie"); //获取全部的cookies

2.2 post和get
使用版本4.3的话,设置请求方法用:
HttpGet/HttpPost ,老版本是用 MethodGet/MethodPost
使用httpclient导入的包:

通过get和post方式调用http接口,总结如下:

* get方式调用http接口的步骤:
* 1.构造HttpClient实例
* 2.构造GetMethod实例
* 3.执行getMethod,调用http接口
* 4.读取内容
* 5.处理返回的内容
* 6.释放连接
*

post:提交表单,收藏或取消收藏,自己看接口请求的header显示,但是注意:可能分为有参数的,和无参数的(参数的具体设置如下)
* post方式调用http接口的步骤:
* 1.构造HttpClient实例
* 2.构造PostMethod实例
* 3.把参数值放入到PostMethod对象中
* 方式1:利用NameValuePair类
List<NameValuePair> data = new ArrayList<NameValuePair>();
data.add(new BasicNameValuePair("username", "1771019*****"));
data.add(new BasicNameValuePair("password", "1111111"));
* 方式2:直接用PostMethod实例对象的addParameter方法
* 4.执行postMethod,调用http接口
* 5.读取内容
* 6.处理返回的内容
* 7.释放连接

2.3 接口相关知识了解(如何获取接口)
对于移动端的,可参照我的博客上篇描述获取HTTPS请求,使用fiddler抓取,手机绑定本地的IP,端口8888,可抓取一般的请求,抓取期间不能断开fiddler

在PC端可以通过浏览器直接获取,如下:

根据返回的response可以判断出到底是哪个接口,或者问开发

2.4 json解析
返回的结果都是json格式的,一般需要先转化为 String类型,然后根据阿里的json解析获取我们想要的值,具体下节进行说明。

初次练手的小用例:(先使用最原始的方法 java.net.URL 进行练习,注意输出流的处理)
实例1:(get请求)

package com.wyy.demo;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

/**
 * Created by yikai on 2016/3/30.
 */
public class Get {

    public static String  doGet() throws Exception{
        URL url=new URL("http://blog.csdn.net/geekstart/svc/GetCategoryArticleList?id=1715873&type=foot");//通过统一资源定位器(java.net.URL)获取连接器(java.net.URLConnection)
        URLConnection con=url.openConnection();     //打开连接
        HttpURLConnection  urlConnection=(HttpURLConnection)con;  // HttpURLConnection继承自URLConnection

        urlConnection.setRequestProperty("Accept-Charset", "utf-8");
        urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");//设置传送的内容类型

//        以输入流的形式获取返回内容
        InputStream inputStream = null;
        InputStreamReader inputStreamReader = null;
        BufferedReader reader = null;
        StringBuffer resultBuffer = new StringBuffer();
        String tempLine = null;

        if (urlConnection.getResponseCode() >= 300) {
            throw new Exception("请求不成功,响应码是 " + urlConnection.getResponseCode());
        }

        try {
            inputStream = urlConnection.getInputStream();
            inputStreamReader = new InputStreamReader(inputStream);
            reader = new BufferedReader(inputStreamReader);

            while ((tempLine = reader.readLine()) != null) {
                resultBuffer.append(tempLine);
            }

        } finally {

            if (reader != null) {
                reader.close();
            }

            if (inputStreamReader != null) {
                inputStreamReader.close();
            }

            if (inputStream != null) {
                inputStream.close();
            }

        }

        return resultBuffer.toString();
    }

    }

实例2:(post请求)

package com.wyy.demo;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

/**
 * Created by yikai on 2016/3/30.
 */
public class Post {
    public static String doPost() throws Exception {
        String parameterData = "readauth?url=/alwayswyy/p/5235280.html";

        URL url = new URL("http://***);
        URLConnection con= url.openConnection();
        HttpURLConnection httpURLConnection = (HttpURLConnection)con;

        httpURLConnection.setDoOutput(true);
        httpURLConnection.setRequestMethod("POST");
        httpURLConnection.setRequestProperty("Accept-Charset", "utf-8");
        httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        httpURLConnection.setRequestProperty("Content-Length", String.valueOf(parameterData.length()));

        OutputStream outputStream = null;
        OutputStreamWriter outputStreamWriter = null;
        InputStream inputStream = null;
        InputStreamReader inputStreamReader = null;
        BufferedReader reader = null;
        StringBuffer resultBuffer = new StringBuffer();
        String tempLine = null;

        try {
            outputStream = httpURLConnection.getOutputStream();
            outputStreamWriter = new OutputStreamWriter(outputStream);

            outputStreamWriter.write(parameterData.toString());
            outputStreamWriter.flush();

            if (httpURLConnection.getResponseCode() >= 300) {
                throw new Exception("请求不成功,响应码是 " + httpURLConnection.getResponseCode());
            }

            inputStream = httpURLConnection.getInputStream();
            inputStreamReader = new InputStreamReader(inputStream);
            reader = new BufferedReader(inputStreamReader);

            while ((tempLine = reader.readLine()) != null) {
                resultBuffer.append(tempLine);
            }

        } finally {

            if (outputStreamWriter != null) {
                outputStreamWriter.close();
            }

            if (outputStream != null) {
                outputStream.close();
            }

            if (reader != null) {
                reader.close();
            }

            if (inputStreamReader != null) {
                inputStreamReader.close();
            }

            if (inputStream != null) {
                inputStream.close();
            }

        }

        return resultBuffer.toString();
    }

}
时间: 2024-10-20 17:21:32

接口测试学习入门(1)--前期知识储备的相关文章

ASP.NET MVC—1、前期知识储备(C#3.0新特性)

在学习ASP.NET MVC之前,有必要先了解一下C#3.0所带来的新的语法特性,这一点尤为重要,因为在MVC项目中我们利用C#3.0的新特性将会大大的提高我们的开发效率,同时,在MVC项目中你将到处可以看到C#3.0新特性的身影. C#3.0新特性 自动属性 隐式类型 var 对象初始化器与集合初始化器 匿名类 扩展方法 Lambda表达式 自动属性 这个概念很简单,其简化了我们在.NET的时候手写一堆私有成员+属性的编程方式,我们只需要使用如下方式声明一个属性,编译器会自动生成所需的成员变量

《深度学习入门基于Python的理论与实现》PDF代码学习指导

入门神经网络深度学习,推荐学习<深度学习入门:基于Python的理论与实现>,这本书不来虚的,一上来就是手把手教你一步步搭建出一个神经网络,还能把每一步的出处讲明白.理解神经网络,很容易就能入门. 深度学习真正意义上的入门书,深入浅出地剖析了深度学习的原理和相关技术.书中使用Python3,尽量不依赖外部库或工具,从基本的数学知识出发,带领读者从零创建一个经典的深度学习网络,使读者在此过程中逐步理解深度学习. <深度学习入门:基于Python的理论与实现>中文版PDF,314页,带

oracle学习入门系列之二 数据库基础知识

oracle学习入门系列之二 数据库基础知识 本篇蛤蟆要梳理下那些被淡忘的数据库基础知识,也许根本就没被人记住过.不管是哪种情况,该记住的必须记住,记不住就把他记下来吧. 首先问几个问题如下: 数据库基础知识是什么? 好吧,蛤蟆直接吐后而不亡,看目录开始吧. 本人邮箱:[email protected] 微信公众号:HopToad 欢迎各界交流 1      基本概念 概念就是概念,大伙对这些名词不要死磕,但是对定义一定要理解,理解方能领悟,领悟方能运用自如后创新. 1.1      数据 数据

阿里知识储备之二——junit学习以及android单元测试

一,junit框架 http://blog.csdn.net/afeilxc/article/details/6218908 详细见这篇博客 juit目前已经可以和maven项目进行集成和测试,而且貌似不需要单独引入junit的组件就可以(maven自身已经引入?) 注意一下以下几个标记 @BeforeClass,@Before,@Test(timeout = 50),@After,@Before,@Test(expected = Exception.class),@After,@Before,

oracle学习入门系列之一 数据库发展与历史

oracle学习入门系列之一 数据库发展与历史 这个oracle学习入门系列是根据本人工作中的一些笔记.项目进行回忆.整理.一方面是自己知识积累,便于技能提升:另一方面是和小伙伴们共进退互通有无,做一个爱分享的好公民.当然最后也夹杂着自己的一个小心愿,改掉自己重理不重文的臭毛病.想想读书考试的时候,当时如果语文英语多个几分,现在可能就不会落到如此...(咳咳~~),做IT也挺好.那就这样开场白切入吧. 既然学习数据库,就不能不抛几个问题了. 1.        为什么需要数据库,什么是数据库 2

Linux学习入门

作为当代前端,前后端的界限越来越小,要想走的更稳,学习Linux操作系统的相关知识是必不可少的. 为什么服务器端采用linux操作系统? 1.linux相对于windows的性能更加稳定 2.前期投入成本低,相比于windows的服务器产品,linux是完全开源免费的,linux支持最小化安装,在相同环境配置下比windows的系统消耗更低. 3.安全性较windows高 由于windows市场占有率,大多数的病毒都是基于真对于windows系统开发,而linux相对较少. windows的系统

模拟电路学习入门的建议(综合整理)

转载自:http://bbs.eetop.cn/viewthread.php?tid=170164 ”模拟电路学习入门“ "如何才算学好模电,数电"一帖引来大家的关注.这里把各位DX的意见整理了一下,便于大家参考.真正掌握一门技术不容易,大家从不同的侧面和经验谈谈自己的体会,对从事这行业的工程师会有点启迪. 找些實用線路集錦或電子製作書看看,有感興趣的就找找理論資料,然後動手練練,很快就是門內漢(or女)了! 先看基本书,再动手练习练习 Razav 如果有耐心看大头英文最好,翻译也很不

自定义控件知识储备-LayoutParams的那些事

在上一篇文章里,我总结了一下自定义控件需要了解的基础知识:View的绘制流程--<自定义控件知识储备-View的绘制流程>.其中,在View的测量流程里,View的测量宽高是由父控件的MeasureSpec和View自身的LayoutParams共同决定的.MeasureSpec是什么,上一篇文章里已经说得很清楚了(啥,没看过?快去路克路克,(??????)??).而LayoutParams呢?是时候在这里做个了断了. LayoutParams是什么? LayoutParams,顾名思义,就是

oracle学习入门系列之五 内存结构、数据库结构、进程

oracle学习入门系列之五 内存结构.数据库结构.进程 上篇蛤蟆简单描述了oracle公司的数据库产品.其他产品及oracle软件的一些特点.干货虽有但是真心是比较少的,这篇开始就是以干货为主,其中夹杂一些扯淡的事情了.蛤蟆一直也在想如何能生动的通过这干巴巴的文字来描述着世界级的软件,太理论大家都看不下去,太实践又缺乏深度.想想自己上大学那会,老师的讲课,无不枯燥乏味啊,满满的兴趣尽是消耗殆尽.所以不能仿效之,我们得走自己特色的路.以最易懂的形式.比喻等手段描述深奥的计算机知识.走起~ 开篇问