将此请求从Bash转换为Python?

时间:2016-12-22 10:54:01

标签: python bash curl python-requests

我在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,这些修改是否重要?

2 个答案:

答案 0 :(得分:0)

有时,webservices会过滤用户代理。 curl和python的用户代理是不同的。这可以解释。 尝试打造一个合法的"用户代理通过修改请求标头。

答案 1 :(得分:0)

最后,用户代理中的代码中没有错误。

问题是目标应用程序不接受具有相同短名称值的网站。

我正在做的是从Bash创建网站,该网站工作,然后从应用程序的界面中删除它,并尝试使用相同的数据从Python创建它。这样做时我遇到了错误,因为尽管已经删除了网站,我还必须从应用程序的垃圾桶中删除它的一些残留数据。如果没有,应用程序返回错误,因为它认为我尝试创建的网站已经存在。

因此,如果我在每次尝试中都引入了不同的短名称,我就不会有任何错误。