Python请求未编码正斜杠

问题描述

我正在开发一种工具,该工具需要使用application/x-www-form-urlencoded内容类型向网站发出请求。当我从ARC for Chrome发出请求时,得到了预期的响应。当我针对Python 3使用requests重现请求时,得到的响应完全不符合我的预期。

我打开WireShark来查找来自ARC的请求和来自Python脚本的请求之间的区别。来自WireShark的用于ARC请求的URL编码形式的内容如下:

TransType=INQ&TransID=RESINQ&ReturnPage=%2Fdmvnet%2Fplate_purchase%2Fs2end.asp&HelpPage=&Choice=A&pltNo=TSPOON&HoldisA=N&HoldSavepltNo=&HoldCallHost=&NumCharsInt=8&CurrentTrans=plate_purchase_reserve&pltType=IGWT&PersonalMsg=Y&Let1=T&Let2=S&Let3=P&Let4=O&Let5=O&Let6=N&Let7=&Let8=

来自WireShark的用于Python脚本请求的URL编码形式的内容如下:

TransType=INQ&TransID=RESINQ&ReturnPage=/dmvnet/plate_purchase/s2end.asp&HelpPage=&Choice=A&pltNo=TSPOON&HoldisA=N&HoldSavepltNo=&HoldCallHost=&NumCharsInt=8&CurrentTrans=plate_purchase_reserve&pltType=IGWT&PersonalMsg=Y&Let1=T&Let2=S&Let3=P&Let4=O&Let5=O&Let6=N&Let7=&Let8=

我看到的(和差异检查器报告的)两者之间的唯一区别是ReturnPage。在ARC的请求中,正斜杠被转换为%2F,而在Python脚本的请求中,正斜杠保持未编码状态。 requests库是否应该执行这种编码?当我在Python中使用原始字符串时,%2F本身会被编码(ReturnPage=%252Fdmvnet%252Fplate_purchase%252Fs2end.asp)。 requests库缺少编码是否在这里也很重要?

am 使用application/x-www-form-urlencoded标头...

headers = {
    "content-type": "application/x-www-form-urlencoded"
}

body = {
    ...
}

response = requests.post("myUrlHere",data=body,headers=headers)

使用requests从Python脚本返回的响应如下:

Status Code: 200
Headers: {
    'Cache-Control': 'private','Content-Type': 'text/html','Server': '','Set-Cookie': 'WebSessionDataID=20200816233709078125172161292511; path=/,ASPSESSIONIDQERAATBR=ODECNAOABGCGADAJEMCCNIDM; secure; path=/','Date': 'Mon,17 Aug 2020 03: 37: 08 GMT','Content-Length': '0'
},Content: "" (Empty)

预期响应是302对象已移动,响应头中提供了所请求资源的目的地。

解决方法

与正斜杠的编码无关。根据{{​​3}}:

默认情况下,请求将对除HEAD以外的所有动词执行位置重定向。

这意味着如果接收到302(找到)(或一般而言,任何3xx响应状态代码),则请求将自动重定向到接收到的位置。如果您不希望这样做,则相同的文档会说:

如果您使用的是GET,OPTIONS,POST,PUT,PATCH或DELETE,则可以使用allow_redirects参数禁用重定向处理:

并提供以下示例:

copy debug info