首页 > 编程知识 正文

用python发送数据curl(python向串口发送数据)

时间:2023-12-22 11:30:28 阅读:318970 作者:TOYB

本文目录一览:

python 执行curl系统命令为什么会返回进度条

试试用os.popen()来执行。popen()可以返回执行结果信息。ret_msg = os.popen(command)通过python执行系统命令时,最要注意路径问题。不论是文件还是目录一定要写全路径,不要用相对路径。

如何用python实现从传感器发送数据和消息到短信和微信等

该回答不涉及传感器选购以及如何使用Python调用,建议根据自己的机子自行淘宝或者参考别的问题(虽然现在没有)

简述:

* 语言:python 2.7.11

* 第三方库:itchat

* 需要设备:采集湿度的设备(机房的电脑?),传感器,一个139邮箱(如果需要短信提示的话)

流程:

* 确定机子以及传感器

* 通过说明书(或者店主...)学会了通过Python获取传感器数据

* 编写判断语句,在命令行输出警告

* 将微信提示或邮箱提示替换警告的方式

微信个人号通知:

import itchat

itchat.auto_login()

itchat.send('Temperature warning')

这个插件的文档在这里:itchat

邮箱通知:

我写了一个简单的Demo: EasierLife/Plugins/MailNotification at master · littlecodersh/EasierLife · GitHub

from MailNotification import MailNotification

with MailNotification() as mail:

mail.send_notification('Temperature warning')

短信通知:

你可以选择使用各种短信平台,但最简单的方式是注册一个139邮箱,然后通过上面邮箱通知的方法发送邮件,你会收到相应的短信提示。

如何使用python 开发一个api

使用 Python 和 Flask 设计 RESTful API

近些年来 REST (REpresentational State Transfer) 已经变成了 web services 和 web APIs 的标配。

在本文中我将向你展示如何简单地使用 Python 和 Flask 框架来创建一个 RESTful 的 web service。

什么是 REST?

六条设计规范定义了一个 REST 系统的特点:

客户端-服务器: 客户端和服务器之间隔离,服务器提供服务,客户端进行消费。

无状态: 从客户端到服务器的每个请求都必须包含理解请求所必需的信息。换句话说, 服务器不会存储客户端上一次请求的信息用来给下一次使用。

可缓存: 服务器必须明示客户端请求能否缓存。

分层系统: 客户端和服务器之间的通信应该以一种标准的方式,就是中间层代替服务器做出响应的时候,客户端不需要做任何变动。

统一的接口: 服务器和客户端的通信方法必须是统一的。

按需编码: 服务器可以提供可执行代码或脚本,为客户端在它们的环境中执行。这个约束是唯一一个是可选的。

什么是一个 RESTful 的 web service?

REST 架构的最初目的是适应万维网的 HTTP 协议。

RESTful web services 概念的核心就是“资源”。 资源可以用 URI 来表示。客户端使用 HTTP 协议定义的方法来发送请求到这些 URIs,当然可能会导致这些被访问的”资源“状态的改变。

HTTP 标准的方法有如下:

==========  =====================  ==================================

HTTP 方法   行为                   示例

==========  =====================  ==================================

GET         获取资源的信息        

GET         获取某个特定资源的信息

POST        创建新资源            

PUT         更新资源              

DELETE      删除资源              

==========  ====================== ==================================

REST 设计不需要特定的数据格式。在请求中数据可以以 JSON 形式, 或者有时候作为 url 中查询参数项。

设计一个简单的 web service

坚持 REST 的准则设计一个 web service 或者 API 的任务就变成一个标识资源被展示出来以及它们是怎样受不同的请求方法影响的练习。

比如说,我们要编写一个待办事项应用程序而且我们想要为它设计一个 web service。要做的第一件事情就是决定用什么样的根 URL 来访问该服务。例如,我们可以通过这个来访问:

http://[hostname]/todo/api/v1.0/

在这里我已经决定在 URL 中包含应用的名称以及 API 的版本号。在 URL 中包含应用名称有助于提供一个命名空间以便区分同一系统上的其它服务。在 URL 中包含版本号能够帮助以后的更新,如果新版本中存在新的和潜在不兼容的功能,可以不影响依赖于较旧的功能的应用程序。

下一步骤就是选择将由该服务暴露(展示)的资源。这是一个十分简单地应用,我们只有任务,因此在我们待办事项中唯一的资源就是任务。

我们的任务资源将要使用 HTTP 方法如下:

==========  ===============================================  =============================

HTTP 方法   URL                                              动作

==========  ===============================================  ==============================

GET         http://[hostname]/todo/api/v1.0/tasks            检索任务列表

GET         http://[hostname]/todo/api/v1.0/tasks/[task_id]  检索某个任务

POST        http://[hostname]/todo/api/v1.0/tasks            创建新任务

PUT         http://[hostname]/todo/api/v1.0/tasks/[task_id]  更新任务

DELETE      http://[hostname]/todo/api/v1.0/tasks/[task_id]  删除任务

==========  ================================================ =============================

我们定义的任务有如下一些属性:

id: 任务的唯一标识符。数字类型。

title: 简短的任务描述。字符串类型。

description: 具体的任务描述。文本类型。

done: 任务完成的状态。布尔值。

目前为止关于我们的 web service 的设计基本完成。剩下的事情就是实现它!

Flask 框架的简介

如果你读过 Flask Mega-Tutorial 系列,就会知道 Flask 是一个简单却十分强大的 Python web 框架。

在我们深入研究 web services 的细节之前,让我们回顾一下一个普通的 Flask Web 应用程序的结构。

我会首先假设你知道 Python 在你的平台上工作的基本知识。 我将讲解的例子是工作在一个类 Unix 操作系统。简而言之,这意味着它们能工作在 Linux,Mac OS X 和 Windows(如果你使用Cygwin)。 如果你使用 Windows 上原生的 Python 版本的话,命令会有所不同。

让我们开始在一个虚拟环境上安装 Flask。如果你的系统上没有 virtualenv,你可以从 上下载:

$ mkdir todo-api

$ cd todo-api

$ virtualenv flask

New python executable in flask/bin/python

Installing setuptools............................done.

Installing pip...................done.

$ flask/bin/pip install flask

既然已经安装了 Flask,现在开始创建一个简单地网页应用,我们把它放在一个叫 app.py 的文件中:

#!flask/bin/pythonfrom flask import Flaskapp = Flask(__name__)@app.route('/')def index():

   return "Hello, World!"if __name__ == '__main__':

   app.run(debug=True)

为了运行这个程序我们必须执行 app.py:

$ chmod a+x app.py

$ ./app.py

* Running on

* Restarting with reloader

现在你可以启动你的网页浏览器,输入  看看这个小应用程序的效果。

简单吧?现在我们将这个应用程序转换成我们的 RESTful service!

使用 Python 和 Flask 实现 RESTful services

使用 Flask 构建 web services 是十分简单地,比我在 Mega-Tutorial 中构建的完整的服务端的应用程序要简单地多。

在 Flask 中有许多扩展来帮助我们构建 RESTful services,但是在我看来这个任务十分简单,没有必要使用 Flask 扩展。

我们 web service 的客户端需要添加、删除以及修改任务的服务,因此显然我们需要一种方式来存储任务。最直接的方式就是建立一个小型的数据库,但是数据库并不是本文的主体。学习在 Flask 中使用合适的数据库,我强烈建议阅读 Mega-Tutorial。

这里我们直接把任务列表存储在内存中,因此这些任务列表只会在 web 服务器运行中工作,在结束的时候就失效。 这种方式只是适用我们自己开发的 web 服务器,不适用于生产环境的 web 服务器, 这种情况一个合适的数据库的搭建是必须的。

我们现在来实现 web service 的第一个入口:

#!flask/bin/pythonfrom flask import Flask, jsonifyapp = Flask(__name__)tasks = [

   {

       'id': 1,

       'title': u'Buy groceries',

       'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',

       'done': False

   },

   {

       'id': 2,

       'title': u'Learn Python',

       'description': u'Need to find a good Python tutorial on the web',

       'done': False

   }]@app.route('/todo/api/v1.0/tasks', methods=['GET'])def get_tasks():

   return jsonify({'tasks': tasks})if __name__ == '__main__':

   app.run(debug=True)

正如你所见,没有多大的变化。我们创建一个任务的内存数据库,这里无非就是一个字典和数组。数组中的每一个元素都具有上述定义的任务的属性。

取代了首页,我们现在拥有一个 get_tasks 的函数,访问的 URI 为 /todo/api/v1.0/tasks,并且只允许 GET 的 HTTP 方法。

这个函数的响应不是文本,我们使用 JSON 数据格式来响应,Flask 的 jsonify 函数从我们的数据结构中生成。

使用网页浏览器来测试我们的 web service 不是一个最好的注意,因为网页浏览器上不能轻易地模拟所有的 HTTP 请求的方法。相反,我们会使用 curl。如果你还没有安装 curl 的话,请立即安装它。

通过执行 app.py,启动 web service。接着打开一个新的控制台窗口,运行以下命令:

$ curl -i

HTTP/1.0 200 OK

Content-Type: application/json

Content-Length: 294

Server: Werkzeug/0.8.3 Python/2.7.3

Date: Mon, 20 May 2013 04:53:53 GMT

{

 "tasks": [

   {

     "description": "Milk, Cheese, Pizza, Fruit, Tylenol",

     "done": false,

     "id": 1,

     "title": "Buy groceries"

   },

   {

     "description": "Need to find a good Python tutorial on the web",

     "done": false,

     "id": 2,

     "title": "Learn Python"

   }

 ]

}

我们已经成功地调用我们的 RESTful service 的一个函数!

现在我们开始编写 GET 方法请求我们的任务资源的第二个版本。这是一个用来返回单独一个任务的函数:

from flask import abort@app.route('/todo/api/v1.0/tasks/int:task_id', methods=['GET'])def get_task(task_id):

   task = filter(lambda t: t['id'] == task_id, tasks)

   if len(task) == 0:

       abort(404)

   return jsonify({'task': task[0]})

第二个函数有些意思。这里我们得到了 URL 中任务的 id,接着 Flask 把它转换成 函数中的 task_id 的参数。

我们用这个参数来搜索我们的任务数组。如果我们的数据库中不存在搜索的 id,我们将会返回一个类似 404 的错误,根据 HTTP 规范的意思是 “资源未找到”。

如果我们找到相应的任务,那么我们只需将它用 jsonify 打包成 JSON 格式并将其发送作为响应,就像我们以前那样处理整个任务集合。

调用 curl 请求的结果如下:

$ curl -i

HTTP/1.0 200 OK

Content-Type: application/json

Content-Length: 151

Server: Werkzeug/0.8.3 Python/2.7.3

Date: Mon, 20 May 2013 05:21:50 GMT

{

 "task": {

   "description": "Need to find a good Python tutorial on the web",

   "done": false,

   "id": 2,

   "title": "Learn Python"

 }

}

$ curl -i

HTTP/1.0 404 NOT FOUND

Content-Type: text/html

Content-Length: 238

Server: Werkzeug/0.8.3 Python/2.7.3

Date: Mon, 20 May 2013 05:21:52 GMT

!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"

title404 Not Found/title

h1Not Found/h1

pThe requested URL was not found on the server./ppIf you     entered the URL manually please check your spelling and try again./p

当我们请求 id #2 的资源时候,我们获取到了,但是当我们请求 #3 的时候返回了 404 错误。有关错误奇怪的是返回的是 HTML 信息而不是 JSON,这是因为 Flask 按照默认方式生成 404 响应。由于这是一个 Web service 客户端希望我们总是以 JSON 格式回应,所以我们需要改善我们的 404 错误处理程序:

from flask import make_response@app.errorhandler(404)def not_found(error):

   return make_response(jsonify({'error': 'Not found'}), 404)

我们会得到一个友好的错误提示:

$ curl -i

HTTP/1.0 404 NOT FOUND

Content-Type: application/json

Content-Length: 26

Server: Werkzeug/0.8.3 Python/2.7.3

Date: Mon, 20 May 2013 05:36:54 GMT

{

 "error": "Not found"

}

接下来就是 POST 方法,我们用来在我们的任务数据库中插入一个新的任务:

from flask import request@app.route('/todo/api/v1.0/tasks', methods=['POST'])def create_task():

   if not request.json or not 'title' in request.json:

       abort(400)

   task = {

       'id': tasks[-1]['id'] + 1,

       'title': request.json['title'],

       'description': request.json.get('description', ""),

       'done': False

   }

   tasks.append(task)

   return jsonify({'task': task}), 201

添加一个新的任务也是相当容易地。只有当请求以 JSON 格式形式,request.json 才会有请求的数据。如果没有数据,或者存在数据但是缺少 title 项,我们将会返回 400,这是表示请求无效。

接着我们会创建一个新的任务字典,使用最后一个任务的 id + 1 作为该任务的 id。我们允许 description 字段缺失,并且假设 done 字段设置成 False。

我们把新的任务添加到我们的任务数组中,并且把新添加的任务和状态 201 响应给客户端。

使用如下的 curl 命令来测试这个新的函数:

$ curl -i -H "Content-Type: application/json" -X POST -d '{"title":"Read a book"}'

HTTP/1.0 201 Created

Content-Type: application/json

Content-Length: 104

Server: Werkzeug/0.8.3 Python/2.7.3

Date: Mon, 20 May 2013 05:56:21 GMT

{

 "task": {

   "description": "",

   "done": false,

   "id": 3,

   "title": "Read a book"

 }

}

注意:如果你在 Windows 上并且运行 Cygwin 版本的 curl,上面的命令不会有任何问题。然而,如果你使用原生的 curl,命令会有些不同:

curl -i -H "Content-Type: application/json" -X POST -d "{"""title""":"""Read a book"""}"

当然在完成这个请求后,我们可以得到任务的更新列表:

$ curl -i

HTTP/1.0 200 OK

Content-Type: application/json

Content-Length: 423

Server: Werkzeug/0.8.3 Python/2.7.3

Date: Mon, 20 May 2013 05:57:44 GMT

{

 "tasks": [

   {

     "description": "Milk, Cheese, Pizza, Fruit, Tylenol",

     "done": false,

     "id": 1,

     "title": "Buy groceries"

   },

   {

     "description": "Need to find a good Python tutorial on the web",

     "done": false,

     "id": 2,

     "title": "Learn Python"

   },

   {

     "description": "",

     "done": false,

     "id": 3,

     "title": "Read a book"

   }

 ]

}

剩下的两个函数如下所示:

@app.route('/todo/api/v1.0/tasks/int:task_id', methods=['PUT'])def update_task(task_id):

   task = filter(lambda t: t['id'] == task_id, tasks)

   if len(task) == 0:

       abort(404)

   if not request.json:

       abort(400)

   if 'title' in request.json and type(request.json['title']) != unicode:

       abort(400)

   if 'description' in request.json and type(request.json['description']) is not unicode:

       abort(400)

如何利用cURL和python对服务端和web端进行接口测试

工具描述

cURL是利用URL语法在命令行方式下工作的文件传输工具,是开源爱好者编写维护的免费工具,支持包括Windows、Linux、Mac等数十个操作系统,最新版本为7.27.0,但是我推荐大家使用7.26.0,从这里可以下载7.26.0版本。

以下是官方介绍的翻译: cURL是一个使用URL语法来传输数据的命令行工具,支持DICT,FILE,FTP,FTPS,GOPHER,HTTP,HTTPS,IMAP,IMAPS,LDAP,LDAPS,POP3,POP3S,RTMP,RTSP,SCP,SFTP,SMTP,SMTPS,Telnet和TFTP。 cURL支持SSL证书,HTTP POST,HTTP PUT,FTP上传,HTTP基础表单上传,代理,cookies,用户+密码身份验证(Basic, Digest, NTLM, Negotiate, kerberos...),恢复文件传输,隧道代理等等。

Python是一种面向对象、直译式计算机程序设计语言,由Guido van Rossum于1989年底发明,它的强大和易用就无需多做说明了,在web开发中或者对开发速度要求较高的开发中应用十分广,不过因为属于脚本类语言,它的性能始终比不上C++、C等语言。

本文主要利用实例说明这两款工具的在测试中的部分用途,更多用法留待大家继续探索。

应用场景

使用cURL模拟客户端对服务端进行查询

在进行接口测试时,应该先找开发人员提供接口列表和对应参数,这样测试的时候就可以验证测试方法是否正确,不过如果可以用浏览器模拟操作的话,也可以自己先试试的,后面的例子会提到。

首先使用客户端访问需要测试的服务端接口,用wireshark抓包结果如下:

把查询字符串以multipart方式post数据到服务器的file_health_info.php接口。

Tips:

Windows版的cURL不像Linux或者Mac一样属于系统自带工具,需要下载,如果要在命令提示符下使用就需要跳转到工具所在目录下才能运行,十分麻烦,我们可以直接把这个工具文件放到Windows目录下,这样无论在哪个目录都可以直接使用“curl”命令运行工具了。

cURL默认就是以post方式发送数据的,所以只需要加入multipart方式就可以了,-F在cURL帮助中的解释是:

-F, --form CONTENT Specify HTTP multipart POST data (H)

--form-string STRING Specify HTTP multipart POST data (H)

--ftp-account DATA Account data string (F)

--ftp-alternative-to-user COMMAND String to replace "USER [name]" (F)

--ftp-create-dirs Create the remote dirs if not present (F)

--ftp-method [MULTICWD/NOCWD/SINGLECWD] Control CWD usage (F)

--ftp-pasv Use PASV/EPSV instead of PORT (F)

Specify HTTP multipart POST data正好满足我们的要求,所以模拟的语句是:

curl -F "newmd5=3bcad21af5f17c1fbff419137297c942###25016566###d:test.exe###1###" file_health_info.php

后面的都是参数,测试前就要找开发确认好。

不过因为服务端支持以gzip方式返回数据,所以我们还可以在请求中加入—compressed参数,即是:

curl --compressed -F "newmd5=3bcad21af5f17c1fbff419137297c942###25016566###d:test.exe###1###"file_health_info.php

为了更好判断服务端接口是否正常,除了对返回数据进行判断外,我们还需要对服务端返回的数据包头进行解析,所以还可以在cURL请求中加入-i参数,最终这个测试语句就变为:

curl –i --compressed -F "newmd5=3bcad21af5f17c1fbff419137297c942###25016566###d:test.exe###1###"file_health_info.php

模拟完成后就要考虑判断返回值的事了,我们首先在命令提示符下运行这个语句,看看返回值。

运行以上命令后,返回的数据如下:

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

HTTP/1.1 100 Continue

HTTP/1.1 200 OK

Date: Fri, 24 Aug 2012 07:47:45 GMT

Content-Type: application/xml

Transfer-Encoding: chunked

Connection: keep-alive

Server: 360 web server

Content-Encoding: gzip

?xml version="1.0" encoding="GBK" ?

ret

retinfo code="0" msg="Operation success" total="1" success="1" empty="0"

cost="999.92752075195"/

softs

soft

md53bcad21af5f17c1fbff419137297c942/md5

sha1/sha1

level4040/level

e_level40.3/e_level

size/size

soft_name![CDATA[]] /soft_name

describ![CDATA[]]/describ

file_desc![CDATA[]]/file_desc

upload0/upload

attr_upload2/attr_upload

class![CDATA[private]]/class

malware![CDATA[cloud.virus]]/malware

is_sys_file0/is_sys_file

is_rep0/is_rep

age0/age

pop0/pop

/soft

/softs

/ret

数据包包头是常见的,一般来说,我们只要判断包头中含有“HTTP/1.1 200 OK”就可以确定服务端正常返回了数据。另外从内容可以看到这是一个xml格式的数据包,我们只需要判断是否存在关键的字段即可,比如level,确定这些之后我们就可以在python中添加如下案例代码了:

首先运行指定的curl命令:

response = os.popen('''curl -i --compressed -F "newmd5=3bcad21af5f17c1fbff419137297c942###25016566###d:test.exe###1###"

然后判断返回值中是否存在我们想要的字段:

self.assertNotEqual(response.find('HTTP/1.1 200 OK'),-1)

self.assertNotEqual(response.find('level'),-1)

上面的内容看起来差不多可以了,但实际还不够严谨,因为服务端返回的这些数据是从数据库中获取的,所以我们还需要查询数据库获取指定值,判断是否和数据包中的一致,比如level:

首先使用python登录数据库服务器:

conn = MySQLdb.connect(host='172.22.54.31', user='user',passwd='test321',db='cloud')

cursor = conn.cursor()

count = cursor.execute('SELECT plevel FROM file where md5="3bcad21af5f17c1fbff419137297c942"')

result = cursor.fetchone()

然后判断返回值中的level是否数据库中的值:

self.assertNotEqual(response.find('''level%s/level'''%result[0]),-1)

测试时除了使用cURL等工具进行模拟,还可以自己用python或其他语言写代码进行post数据,不过当时简单起见所以就选择了用cURL测试。

使用cURL模拟控制台登录

说到模拟登录或者模拟点击,很多同学可能直接联想到QTP等模拟界面操作的工具,事实上这种工具有一个很大的弊端是太依赖控件,如果界面控件变了,那么可能整个脚本就无效了,现在的程序设计都倾向界面逻辑分离,这样修改界面时就不会动到底下的功能接口,开发人员可以随时修改界面控件,如果还是采取QTP等模拟点击的方法测试,结果可能是事倍功半的,如果测试时直接点用接口就可以避免这种问题。

下面的例子是模拟控制台登录的,登录URL为:

index.php?r=site/login ,首先使用浏览器登录一次,看看实际效果如何。

Tips:

测试php或其他web程序时建议使用chrome,因为它自带的Developer Tools十分好用,当然firefox或者IE9也有类似的工具,看个人习惯吧。按F12打开工具,选择Network标签页,然后输入用户名、密码点击登录,这时Network下方会显示登录过程中浏览器想控制台请求的所有数据,包括请求类型、表单数据等,这些是我们模拟操作的数据来源。

从上图可以获取几个重点信息:请求URL、请求类型、数据类型、数据内容、并且支持gzip压缩等。我们用curl模拟如下:

curl -i --compressed cloud/index.php?r=site/login -d “username=admin” -d “userpass=admin”

使用-i和—compressed的原因再上一个例子已经说了,这里不再赘述,重点是后面的-d,它在官方帮助的解释是:

-d, --data DATA HTTP POST data (H)

--data-ascii DATA HTTP POST ASCII data (H)

--data-binary DATA HTTP POST binary data (H)

--data-urlencode DATA HTTP POST data url encoded (H)

--delegation STRING GSS-API delegation permission

--digest Use HTTP Digest Authentication (H)

--disable-eprt Inhibit using EPRT or LPRT (F)

--disable-epsv Inhibit using EPSV (F)

而我们从Developer Tools返回的数据已经知道,返回数据的格式是

“application/x-www-form-urlencoded”,所以很明显需要使用-d的HTTP POST data url encoded特性。不过格式中还有关键字form,莫非也支持-F参数登录,试试:

curl -i --compressed cloud/index.php?r=site/login -F “username=admin” -F “userpass=admin”,果然成功,呵呵~

也许有同学有疑问,为何不模拟warnsetup、refer,这是因为测试时发现登录界面只需要用户名和密码就够了,refer 用于记录来源网页,在这里用处不大,warnsetup只是用于验证登录码的,这个已经去掉了。

接下来要验证数据,我们在命令提示符中运行上面的命令,返回结果如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

HTTP/1.1 302 Moved Temporarily

Date: Fri, 24 Aug 2012 08:29:07 GMT

Content-Type: text/html

Transfer-Encoding: chunked

Connection: keep-alive

X-Powered-By: PHP/5.4.3

Set-Cookie: PHPSESSID=4711d2365de9aaaca0c28b1ca52183f0; path=/

Expires: Thu, 19 Nov 1981 08:52:00 GMT

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Pragma: no-cache

Set-Cookie: PHPSESSID=81d4bb65e888c1b6347120641eb4798b; path=/

Location: ./index.php

Server: 360 web server

很奇怪吧,乍一看控制台没有返回任何有用信息,不过里面那句HTTP/1.1 302 Moved Temporarily是不是特别眼熟?这个特殊的302(表示http重定向)正是我们在Developer Tools看到的状态值,看到这个已经可以80%确定我们登录已经成功了,更重要的是返回包中的内容:Location: ./index.php,这说明控制台已经通知请求端跳转到index.php,如果登录失败控制台会继续停留在当前登录界面的,我们只需要修改curl语句中的用户名或者密码就知道了,这种情况下返回包就是登录界面的php源码,这里不再赘述。

使用cURL以get方式测试控制台搜索接口

测试方法同上面差不多,首先使用chrome打开控制台进入对应页面,在搜索框中输入“test.exe”,点击搜索,使用developer tools抓包,内容如下:

cURL模拟get方式发送数据的参数是-G,了解这个后面要模拟就很简单了:

curl -i --compressed -G “cloud/index.php?r=file_cloud/api/searchfilename=59c7dd2eafdbe86b2e23bcdabb575448bg=0lm=19 ”

其中每个参数的含义要分别了解:filename表示输入的关键字,bg表示数据库第一行,lm表示共显示19行数据。这个接口返回的数据如下:

{"rows":[{"level":"10","plevel":"10","id":"20","md5":"59c7dd2eafdbe86b2e23bcdabb575448","soft_name":"","soft_desc":"","file_desc":"QVBJIFRyYWNpbmcgWDg2IEhvb2sgRW5naW5l","is_sys_file":"127","size":"41984","is_rep":"0","file_name":"apihex86.d

ll","file_version":"6.1.7600.16385","product_version":"6.1.7600.16385","copyright":"u00a9 Microsoft Corporation. All rights reserved.","lang":"0","org_name":"YXBpaGV4ODYuZGxs","sign_name":"TWljcm9zb2Z0IFdpbmRvd3M=","company_name":"Microsof

t Corporation","update_time":"2012-07-31 18:14:27","create_time":"2012-07-31 18:14:27","creator_mid":"15be5b7dce003cdc2c1d1448afcf6cf0"}],"count":"1"}

分别是文件属性和文件信息,这涉及到两个数据库表,所以验证数据需要用python从两张表中获取对应信息。

从第一张表获取文件属性,比如只获取plevel:

SELECT plevel FROM `file` where md5="59c7dd2eafdbe86b2e23bcdabb575448"

从第二张表获取文件信息,比如只获取company_name:

SELECT company_name FROM file_info where md5="59c7dd2eafdbe86b2e23bcdabb575448"

Python代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

conn = MySQLdb.connect(host='%s'% self.host, user='user',passwd='test321',db='cloud')

cursor = conn.cursor()

count = cursor.execute('SELECT plevel FROM `file` where md5="111111932490c813bf5ea9d8aa6fa60c"')

result = cursor.fetchone()

self.assertNotEqual(response.find(str(result[0])),-1)

count = cursor.execute('SELECT company_name FROM file_info where md5="111111932490c813bf5ea9d8aa6fa60c"')

result1 = cursor.fetchone()

self.assertNotEqual(response.find(result1[0]),-1)

当然严谨的测试案例是每一个属性字段都需要进行查找和匹配,这里就不再赘述了。

后记:这种接口测试用到的无非就是curl、python的unitest而已,可能有的人会疑问,为什么用curl而不用py自带的pycurl或者request之类,我觉得只要能满足需求,能够用现成的就用现成的,怎么简单怎么来。搞一堆代码维护起来也麻烦啊,现在qa行业跳槽也比较频繁,万一换了个人看不懂你的代码怎么办?呵呵

怎么把这个 curl 命令用 python requests 搞定

打开命令提示符 Python34换成你的python所在目录 cd C:Python34Scriptspip install requests

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。