python中pos函数,python pos是什么

本文详细介绍了接口测试中POST请求的四种数据格式:application/x-www-form-urlencoded、application/json、text/xml和multipart/form-data。通过Fiddler和Python的Requests库模拟请求,展示了如何构造请求头和请求主体,帮助理解各种数据格式的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

9beae3d78dc81f03127393d15ffa89e7.png

在接口测试中,接口通常是GET请求或者POST请求。以下是对接口测试中常见的四种Post请求数据方式进行一个详细的讲解:

一、post请求主体详解

一个正常的post请求主要包括请求行,请求头,请求主体。

对于get请求来说没有请求主体entity-body。对于post请求而言,不会对发送请求的数据格式进行限制,理论上你可以发任意数据,但是服务器能不能处理就是另一回事了。服务器收到数据后,如何解析数据呢?它会以请求头中的Content-Type设置的内容来进行数据解析。确定好Content-Type的格式之后,请求主体的数据格式也就确定下来了。

二、Content-Type的格式有四种:application/x-www-form-urlencoded(这也是默认格式)

application/json

text/xml

multipart/form-data

这些不同的post请求数据格式要通过HttpEntity来构造,有必要简单理一下HttpClient的HttpEntity对象,因为所有的post请求数据均需要置于HttpEntity实体中进行发送。HttpEntity是一个接口,实现这个接口的具体类有很多,比较常用的是StringEntity、UrlEncodedFormEntity(继承自StringEntity)、MultipartEntity。他们将在发送不同格式的post请求时被用到。接下来就详细地介绍每一种数据格式对应的fiddler请求模拟和Requests请求模拟(Python实现)的实现情况。

三、application/x-www-form-urlencoded数据格式

在W3C官网上明确对这种数据格式进行了定义:This is the default content type. Forms submitted with this content type must be encoded as follows:Control names and

values are escaped. Space characters are replaced by '+', and then reserved characters are escaped as described in

[RFC1738], section 2.2: Non-alphanumeric characters are replaced by '%HH', a percent sign and two hexadecimal digits

representing the ASCII code of the character. Line breaks are represented as "CR LF" pairs (i.e., '%0D%0A').The control

names/values are listed in the order they appear in the document. The name is separated from the value by '=' and

name/value pairs are separated from each other by '&'.

这是post请求最常见也是默认的数据提交格式。它要求数据名称(name)和数据值(value)之间以等号相连,与另一组name/value值之间用&相连。例如:parameter1=12345&parameter2=23456。将请求的内容进行格式化了,其实这个方法同时简化的客户端发送,也简化了服务器端获取,服务器通过getParameters(String name)即可获取到传送来的信息。这是最常见post提交数据的方式,以form表单形式提交数据。

(1)如果用fiddler模拟请求的话,请求头和请求主体的内容可以这样构造:

093eebac4eaaa9671d402f70e26fe112.png

模拟请求之后,从返回结果可以查看到我们的请求数据:

dcc88414ac0418345d95ec155335a58c.png

(2)如果用Requests模拟post请求的话,请求可以这样构造:datas = {'parameter1':'12345','parameter2':'23456'}

r = requests.post('http://example.com',data=datas)

print(r.content)

print(r.status_code)

Reqeusts支持以form表单形式发送post请求,只需要将请求的参数构造成一个字典,然后传给requests.post()的data参数即可。

四、application/json数据格式

application/json格式的请求头是指用来告诉服务端post过去的消息主体是序列化后的 JSON 字符串。

(1)如果用fiddler模拟请求的话,请求头和请求主体的内容可以这样构造:

8bb293fe35dfd45ba011de15d42ab3b0.png

模拟请求之后,从返回结果可以看到我们的请求数据:

052ea96b183ed608bbed57be6d5c3fa1.png

(2)如果用Requests模拟post请求的话,请求可以这样构造:url = 'http://www.example/post'

s = json.dumps({'key1': 'value1', 'key2': 'value2'})

r = requests.post(url, data=s)

print (r.text)

这里我们可以发现Requests模拟post请求时,请求头格式为application/x-www-form-urlencoded与application/json的主要差别在于请求主体的构造格式(前者是键值对,后者是JSON串),前者直接用字典传入,后者用json.dumps()函数将字典转为JSON串即可。

五、text/xml数据格式

(1)如果用fiddler模拟请求的话,请求头和请求主体的内容可以这样构造:

d37ff6a66dfd1b4080e735d151b12534.png

模拟请求之后,从返回结果可以看到我们的请求数据:

0f77f9d593956f2dbed68817fcf77910.png

(2)如果用Requests模拟post请求的话,请求可以这样构造:xml = """my xml"""

headers = {'Content-Type': 'application/xml'}

requests.post('http://www.example.com', data=xml, headers=headers)

或者把xml作为一个文件来传输:import requests

def request_ws(request):

with open(archivo_request,"r") as archivo:

request_data = archivo.read()

target_url = "http://127.0.0.1:8000/?wsdl"

headers = {'Content-type':'text/xml'}

data_response = requests.post(target_url, data=request_data, headers=headers)

六、multipart/form-data数据格式

除了传统的application/x-www-form-urlencoded表单,我们另一个经常用到的是上传文件用的表单,这种表单的类型为multipart/form-data。

(1)如果用fiddler模拟请求的话,请求头和请求主体的内容可以这样构造:

第一步,先设置好请求头格式,然后点击upload file...

2c1e4916f2e11d7ce93c26350b74e4fa.png

第二步,上传你的文件,这里我上传一个png的图片。

111d5eb8abbfe6bab7273515ab90c849.png

这是fiddler根据我们上传的文件自动调整生成的请求,在请求头中看到,我们需要选择一段数据作为“分割边界”(boundary属性),这个“边界数据”不能在内容其他地方出现,一般来说使用一段从概率上说“几乎不可能”的数据即可。每次post浏览器都会生成一个随机的30-40位长度的随机字符串,浏览器一般不会遍历这次post的所有数据找到一个不可能出现在数据中的字符串,一般都是随机生成。选择了这个边界之后,浏览器便把它放在Content-Type 里面传递给服务器,服务器根据此边界解析数据。下面的数据便根据boundary划分段,每一段便是一项数据。(每个field被分成小部分,而且包含一个value是"form-data"的"Content-Disposition"的头部;一个"name"属性对应field的ID等等,文件的话包括一个filename)模拟请求之后,从返回结果可以看到我们的请求数据:

c1f2ffded26233fd5a2bf30028e31353.png

(2)如果用Requests模拟post请求的话,请求可以这样构造:url = 'http://www.example.com'

files = {'file': open('C://Users//Someone//Desktop//2.png', 'rb')}

r = requests.post(url, files=files)

print(r.text)

综上,就是接口测试中fiddler与requests模拟post接口四种请求数据的构造方法,总结起来有利于在以后的接口测试工组过程中可以及时查阅。

同时,Requests库还可以处理多部分编码(Multipart-Encoded)的文件,比如xls文件,甚至改写content-Type的报头。

比如:url = 'http://httpbin.org/post'

files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}

r = requests.post(url, files=files)

(推荐操作系统:windows7系统、Python 3.9.1,DELL G3电脑。)

<think>好的,用户想了解Python中find函数的用法和示例。首先,我需要回忆一下find函数的基本功能。find是字符串方法,用于查找子字符串的位置。如果找到返回索引,没找到返回-1。这一点和index方法不同,index会抛出异常。 接下来,我需要检查用户提供的引用内容。引用2和3都提到了find函数的基本用法、处理未找到的情况、起始结束位置参数,以及与index的区别。用户可能想知道这些基本点,以及实际应用中的例子。 用户可能需要具体的示例,比如如何查找子字符串,如何处理找不到的情况。此外,进阶用法比如结合循环查找多个出现的位置,或者分割字符串,可能也是用户感兴趣的。 还要注意用户提到的系统级指令,比如行内数学表达式用$...$,但这里可能用不上。但需要确保回答结构清晰,分步骤说明,并引用提供的参考资料。引用2和3都提到了注意事项和性能优化,可能需要在回答中提及。 需要确认是否有其他相关功能,比如rfind或者正则表达式,但根据引用内容,用户可能只需要find函数本身。还要比较find和index的区别,因为用户可能容易混淆这两个方法。 最后,生成相关问题,帮助用户进一步学习。比如如何处理多个匹配,或者性能方面的考虑。确保回答准确,并且引用正确的来源,比如引用2和3中的内容。</think>### Python find()函数详解与实战应用 Python的字符串查找功能中,`find()`是最常用的基础方法之一。该函数用于定位子字符串在父字符串中首次出现的位置,具有安全返回机制(未找到返回-1)和灵活的搜索范围控制。 #### 一、基本语法 ```python str.find(sub[, start[, end]]) ``` - `sub`:要查找的子字符串 - `start`:可选,起始搜索位置(默认0) - `end`:可选,结束搜索位置(默认字符串末尾) 示例1:基础查找 ```python text = "Python编程从入门到精通" position = text.find("入门") print(position) # 输出:8 ``` #### 二、核心特性 1. **安全返回值** 当子字符串不存在时返回-1,避免程序中断: ```python print("Hello".find("z")) # 输出:-1 ``` 2. **范围限定搜索** 通过设置起止位置缩小搜索范围: ```python text = "apple[orange]apple" bracket_start = text.find("[") bracket_end = text.find("]") print(text[bracket_start+1 : bracket_end]) # 输出:orange ``` 3. **与index()对比** ```python try: print("Python".index("th")) # 输出:2 print("Python".index("zz")) # 抛出ValueError except ValueError: print("未找到指定字符串") ``` #### 三、进阶应用 1. **多重查找** 通过循环定位所有匹配项: ```python text = "abracadabra" target = "a" positions = [] start = 0 while (pos := text.find(target, start)) != -1: positions.append(pos) start = pos + 1 print(positions) # 输出:[0, 3, 5, 7, 10] ``` 2. **数据清洗** 提取特定格式内容: ```python log = "Error[2023-08-01]: File not found" date_start = log.find("[") + 1 date_end = log.find("]") print(log[date_start:date_end]) # 输出:2023-08-01 ``` #### 四、性能建议 - 对超长文本(>1MB)建议先转换为字节对象`bytes`再处理 - 频繁查找时考虑预编译正则表达式 - 批量处理建议结合切片操作减少内存消耗[^2][^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值