接口测试 HTTP 接口测试中的一些坑

刘津嘉 · June 17, 2016 · Last by chen replied at June 20, 2016 · Last modified by admin 恒温 · 1734 hits

本周,在群里和东哥对HTTP接口请求进行了激烈的讨论,也让我对接口的请求处理有了一些不一样的看法

HTTP 请求头设置

如果对HTTP请求头,不是很了解到同学,可以先查看这篇Blog HTTP详解

请求头的设置,会直接影响到请求参数的格式和请求结果

常用的头设置说明
1: HTTP/1.1
HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回

2: Accept:/
Accept:告诉WEB服务器自己接受什么介质类型,/ 表示任何类型,type/* ,表示该类型下的所有子类型,type/sub-type

3: User-Agent
User-Agent头域的内容包含发出请求的用户信息。Referer 头域允许客户端指定请求uri的源资源地址,这可以允许服务器生成回退链表,可用来登陆、优化cache等

4: Content-type
Content-Type实体头用于向接收方指示实体的介质类型,指定HEAD方法送到接收方的实体介质类型,或GET方法发送的请求介质类型,表示后面的文档属于什么MIME类型

在接口测试中,常用的方法有四种,GET、POST、PUT、DEL ,而GET方法请求中,最常见的就是由于URL中含有特殊字符导致在传递参数时,导致接口请求请求参数被改变,服务器解析失败。

以下两个例子,是我在工作中碰到的比较有特点的两个例子

例 1 :

将以下URL地址放入Google Chrome ,按F12 ,观察请求参数与实际参数的区别
Test Addr

你会发现, 你的请求参数应该是

dFRLTecWI5V2ke6xoVj33qmvmI0r3g+nQNsqYxPDmn6Y4c8NXPjwhNvLWX9ueQ02zr99dQl5O2Foxl0EnSgn8B75b4q+4aRsT6qq6D5b91K86Y3Kb8lUanQS7f7k6Z6ElXIXUlm3ZGY7U5v9qlP1G3VuhENd5JdQqRGdgHDssL7Y6E2WtYARbp7CuTVGi0pCBByrFsd3XGpuSmy7acMLUQ==

但是实际Http发送出去的参数却是这样的

dFRLTecWI5V2ke6xoVj33qmvmI0r3g nQNsqYxPDmn6Y4c8NXPjwhNvLWX9ueQ02zr99dQl5O2Foxl0EnSgn8B75b4q 4aRsT6qq6D5b91K86Y3Kb8lUanQS7f7k6Z6ElXIXUlm3ZGY7U5v9qlP1G3VuhENd5JdQqRGdgHDssL7Y6E2WtYARbp7CuTVGi0pCBByrFsd3XGpuSmy7acMLUQ==

这也是在接口测试中,关于Get方法的常规使用中,极其容易出现的问题。至于怎么解决这个问题,方法有很多,甚至只需要把GET方法替换成POST即可(很多同学认为接口其实大部分是POST的,不尽然,具体看业务情况和可控的安全范围)

例 2 :

在常见的Post方法中,一般POST的参数其实是一个json或称为object的dict,但是,很可能因为URL请求时,使用了请求头为

  • Content-type:x-www-form-urlencoded
  • (这里就不额外提供一条这样的接口了,如果有兴趣,可以自己尝试一下)

    那么很有可能代码如下(伪代码)

    import requests
    headers = {}
    postdata = {"key_1":"value_1","key_2":"value_2"}
    headers['Content-type'] = "x-www-form-urlencoded"
    page = requests.post(url='xxxxx.json',data = postdata,headers )

    那么你post出去的参数格式,很可能是一个key_1=value_1&key_2=value2这样的一个格式

    由于时间关系,暂时写到这里 ,学习需要点滴积累,希望大家能在TesterHome学到更多的知识,认识更多志同道合的朋友!

    如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
    共收到 8 条回复 时间 点赞

    我在 chrome 里请求的时候是正常的

    你看错了地方

    请点 view source

    query string parameter 和 view source 显示的格式问题 你可以自己百度一下

    所以你的问题 根本就不是 Get 方法 造成的,还是找其他原因吧😅

    你可以试试把+号 转换成 %2B 再请求试试

    请正确理解url转义,uri转义;+号有些后端框架可转可不转,前后端的转义规则需要一致。

    requests的官方文档好好看看吧 链接 ,post的body格式是可以设定的。

    需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up