我在Bash中收到了一个请求,我必须将其转换为Python 2.7。我曾多次做过这种翻译,但现在我无法使其发挥作用,我不明白为什么。
首先,我收到了这个Bash请求:
curl -X POST -v -u user@domain:password --data "@file.json" -H "Content-Type:application/json" http://destination_url_a
使用 file.json 文件,其内容如下:
{
"username":"user@domain",
"password":"password",
"shortName":"a-short-name",
"visibility":"PRIVATE",
"sitePreset":"site-dashboard",
"title":"A Title",
"description":"A description."
}
如果我在计算机中执行Bash行,结果就会成功。
与往常一样,我尝试在Python中使用requests
库来使其工作。我做的是:
import requests
from requests.auth import HTTPBasicAuth
import json
data = {
"username": "user@domain",
"password": "password",
"shortName": "a-short-name",
"visibility": "PRIVATE",
"sitePreset": "site-dashboard",
"title": "A Title",
"description": "A description.",
}
headers = {'Content-Type': 'application/json'}
data_json = json.dumps(data)
r = requests.post(
url='http://destination_url_a',
data=data_json,
headers=headers,
auth=HTTPBasicAuth('user@domain', 'password'),
verify=False,
)
不幸的是,尽管状态代码为r
,但存储在200
变量中的响应是错误的。
可能会发生什么?有没有人在我的代码中发现问题或有任何想法?
修改
然而,这是另一个非常相似的例子,完美地运作:
击:
curl -v -H "Content-Type:application/json" -X POST --data "@file.json" -u user@domain:password http://destination_url_b
我的Python代码
import requests
from requests.auth import HTTPBasicAuth
import json
data = {
"userName": "user@domain",
"password": "password",
"firstName": "Firstname",
"lastName": "Lastname",
"email": "email@domain.com",
"disableAccount": "False",
"quota": -1,
"groups": ["a_group",],
}
headers = {'Content-Type': 'application/json'}
data_json = json.dumps(data)
r = requests.post(
url='http://destination_url_b',
data=data_json,
headers=headers,
auth=HTTPBasicAuth('user@domain', 'password'),
verify=False,
)
它似乎与其他请求几乎相同,但这有效。发送不同的数据,并发送到不同的子域(两者都发送到同一域)。如果我们谈论您提到的User-Agent
,这些修改是否重要?
答案 0 :(得分:0)
有时,webservices会过滤用户代理。 curl和python的用户代理是不同的。这可以解释。 尝试打造一个合法的"用户代理通过修改请求标头。
答案 1 :(得分:0)
最后,用户代理中的代码中没有错误。
问题是目标应用程序不接受具有相同短名称值的网站。
我正在做的是从Bash创建网站,该网站工作,然后从应用程序的界面中删除它,并尝试使用相同的数据从Python创建它。这样做时我遇到了错误,因为尽管已经删除了网站,我还必须从应用程序的垃圾桶中删除它的一些残留数据。如果没有,应用程序返回错误,因为它认为我尝试创建的网站已经存在。
因此,如果我在每次尝试中都引入了不同的短名称,我就不会有任何错误。