【问题标题】:Python: Issue with POST data in RequestsPython:请求中的 POST 数据问题
【发布时间】:2016-09-10 07:47:09
【问题描述】:

我正在尝试使用 Python 2.7 中的 Requests 2.9.1 来学习如何发送 POST 数据。但是,我觉得我在提供给requests的数据中遗漏了一些东西,或者以某种方式错误地格式化了某些东西,并且整晚都在敲我的脑袋。

我基于表单数据的网站是:http://qpublic9.qpublic.net/la_orleans_address.php

我使用 Charles (https://www.charlesproxy.com) 来查看 POST 数据的实际内容,这就是我所看到的。我输入的数据是 1013 用于 街道编号(字段为 streetNumber)和 ST ANN(依赖于自动完成)用于 *Street Name **(streetName 是此处的字段)。这就是我需要在网站上手动输入的所有内容,我从 Charles 那里收到了这个 POST 数据:

BEGIN=0&searchType=address_search&streetNumber=1013&streetName=ST+ANN&streetType=&streetDirection=&streetUnit=&Address+Search=Address+Search

最初我只尝试使用 streetNumberstreetName,因为这是我在网站测试时输入的唯一数据,但这产生了错误。现在我正在为没有输入任何内容的数据输入空字段,我猜这可能是导致问题的原因,但我不确定。下面是我用于代码的内容,然后是我收到的错误消息(这是一条 SQL 错误消息,让我觉得我格式化数据有效负载的方式可能有问题)。

import requests

payload = {'searchType': 'address_search', 'streetNumber': '1013', \
'streetName': 'ST+ANN', 'streetType': '', 'streetDirection': '', \
'streetUnit': '', 'Address+Search': 'Address+Search' }

response = requests.post("http://qpublic9.qpublic.net/la_orleans_alsearch.php", \
data=payload)

print response.text

输出和错误:

<LINK REL=stylesheet HREF="http://www.qpublic.net/la/neworleans/sytle.css" 
TYPE="text/css">
Could Not Read Data:You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version for the
right syntax to use near ' 100' at line 1

由于我只是一个用户,而不是该网站的开发人员,我无权查看他们的后端代码是什么样的,但由于它可以在我的浏览器中的网站上运行,我猜它是什么与我的 payload 格式而不是他们的代码有关。

对我可能遗漏的内容有什么建议吗?或者有类似问题的经验吗?无论我删除多少个空字段,最终都会出现同样的错误。

谢谢!

编辑: 在我的代码中,我没有在 python 代码中使用反斜杠,我在这里使用它是为了便于阅读。此外,错误消息中没有换行符,再次只是为了便于阅读。由于我不熟悉 POST 数据的结构,因此我将保留 Charles 的原样,以防更改某些内容可能导致沟通不畅。

编辑 2: 另外,我在测试时收到了 200 () 的响应代码,因此这似乎不是错误通过 HTTP 连接,所以这又让我觉得我在 POST 数据中遗漏了一些东西。

【问题讨论】:

  • 他们的服务器代码没有正确地转义数据。这不是你的问题。
  • 不知Little Bobby Tables能不能发到服务器。
  • 你不应该把+放在ST+ANN中,它应该是ST ANNrequests.post() 会自动进行 URL 编码,不需要你自己做。
  • 注意:你不需要反斜杠:花括号将确保所有内容都被视为一个语句。事实上,我建议反对 使用反斜杠:如果你不小心在反斜杠后面有一个不可见的空格,可能会发生意想不到的事情。我还建议在 Python 代码中以 80 个字符的线宽换行。
  • @Evert 你读过问题的最后一段吗?反斜杠不在实际代码中。

标签: python python-2.7 http-post python-requests


【解决方案1】:

取出您放在单词之间的所有+ 字符。那是空间的 URL 编码表示,但 requests 模块会为您做到这一点。如果您明确使用它,它将重新编码+,因此服务器脚本会将其视为文字+,而不是应该解码到的空间。

您还缺少payload 中的BEGIN=0 参数。在我的测试中,这似乎是您遇到错误的原因。

payload = {'BEGIN': '0', 'searchType': 'address_search', 'streetNumber': '1013', \
            'streetName': 'ST ANN', 'streetType': '', 'streetDirection': '', 
            'streetUnit': '', 'Address Search': 'Address Search' }

如果您查看网页源代码,这是隐藏输入之一:

<INPUT TYPE=HIDDEN NAME=BEGIN VALUE="0">
<INPUT TYPE=HIDDEN NAME="searchType" VALUE="address_search">

【讨论】:

  • 在您的第一个建议之后已经尝试过,同样的问题仍然存在。
  • 再次感谢,正如我上面提到的,我错过了您捕获的 BEGIN=0,非常感谢!
猜你喜欢
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多