仅使用标准库将curlpost请求转换为Python

仅使用标准库将curlpost请求转换为Python,python,json,curl,Python,Json,Curl,我想将这个curl命令转换为可以在Python中用于现有脚本的命令 curl -u 7898678:X -H 'Content-Type: application/json' \ -d '{"message":{"body":"TEXT"}}' http://sample.com/36576/speak.json 文本是我想用脚本其余部分生成的消息替换的内容。(这已经很合理了,尽管我不认为它符合最佳实践或特殊性。-需要了解如何正确地学习编程(即不要使用谷歌组装东西)) 如果可能的话,我希望这可

我想将这个curl命令转换为可以在Python中用于现有脚本的命令

curl -u 7898678:X -H 'Content-Type: application/json' \
-d '{"message":{"body":"TEXT"}}' http://sample.com/36576/speak.json
文本是我想用脚本其余部分生成的消息替换的内容。(这已经很合理了,尽管我不认为它符合最佳实践或特殊性。-需要了解如何正确地学习编程(即不要使用谷歌组装东西))

如果可能的话,我希望这可以用于标准库。

看看pycurl

如果可能的话,我希望这个可以与标准库一起使用

标准库提供和用于处理URL:

>>> import httplib, urllib
>>> params = urllib.urlencode({'apple': 1, 'banana': 2, 'coconut': 'yummy'})
>>> headers = {"Content-type": "application/x-www-form-urlencoded",
...            "Accept": "text/plain"}
>>> conn = httplib.HTTPConnection("example.com:80")
>>> conn.request("POST", "/some/path/to/site", params, headers)
>>> response = conn.getresponse()
>>> print response.status, response.reason
200 OK
但是,如果要执行
curl
本身,可以调用
os.system()


如果您愿意放宽仅限标准库的限制,可以使用。请注意,它不是很Pythonic(它几乎只是libcurl上的一层薄薄的饰面),我也不确定它与python3的兼容性。

虽然有一些方法可以处理,但如果您正在进行基本授权(这意味着有效地以明文形式发送用户名和密码)然后,您可以使用urllib2.Request和urllib2.urlopen执行所有需要的操作:

import urllib2

def basic_authorization(user, password):
    s = user + ":" + password
    return "Basic " + s.encode("base64").rstrip()

req = urllib2.Request("http://localhost:8000/36576/speak.json",
                      headers = {
        "Authorization": basic_authorization("7898678", "X"),
        "Content-Type": "application/json",

        # Some extra headers for fun
        "Accept": "*/*",   # curl does this
        "User-Agent": "my-python-app/1", # otherwise it uses "Python-urllib/..."
        },
                      data = '{"message":{"body":"TEXT"}}')

f = urllib2.urlopen(req)
我用测试工具对此进行了测试,以便可以看到,除了排序顺序之外,发送的数据在这两种情况下都是相同的。这里第一个是用curl完成的,第二个是用urllib2完成的

% nc -l 8000
POST /36576/speak.json HTTP/1.1
Authorization: Basic Nzg5ODY3ODpY
User-Agent: curl/7.19.4 (universal-apple-darwin10.0) libcurl/7.19.4 OpenSSL/0.9.8k zlib/1.2.3
Host: localhost:8000
Accept: */*
Content-Type: application/json
Content-Length: 27

{"message":{"body":"TEXT"}} ^C

% nc -l 8000
POST /36576/speak.json HTTP/1.1
Accept-Encoding: identity
Content-Length: 27
Connection: close
Accept: */*
User-Agent: my-python-app/1
Host: localhost:8000
Content-Type: application/json
Authorization: Nzg5ODY3ODpY

{"message":{"body":"TEXT"}}^C
(这与输出略有不同。我的测试用例没有使用与您使用的url路径相同的url路径。)

不需要使用底层的httplib,它不支持urllib2提供的代理支持。另一方面,我确实发现urllib2在这种简单的请求之外非常复杂,如果您希望更好地支持发送哪些标头以及它们的发送顺序,请使用httplib。

谢谢

这很有效

import urllib2

def speak(status):

    def basic_authorization(user, password):
        s = user + ":" + password
        return "Basic " + s.encode("base64").rstrip()

    req = urllib2.Request("http://example.com/60/speak.json",
                  headers = {
       "Authorization": basic_authorization("2345670", "X"),
     "Content-Type": "application/json",


        "Accept": "*/*",   
        "User-Agent": "my-python-app/1", 
        },
                      data = '{"message":{"body":'+ status +'}}')

    f = urllib2.urlopen(req)


speak('Yay')

使用httplib意味着跳过urllib和urllib2的一些功能,比如对代理的支持。@dalke»没错;这只是一个简单的示例,用于发出
GET
POST
请求,我认为OP的目的是这样的。我只是发现使用httplib和进行URL搜索通常不值得付出努力,因为urllib2提供了所有这些以及更多--
import urllib2

def speak(status):

    def basic_authorization(user, password):
        s = user + ":" + password
        return "Basic " + s.encode("base64").rstrip()

    req = urllib2.Request("http://example.com/60/speak.json",
                  headers = {
       "Authorization": basic_authorization("2345670", "X"),
     "Content-Type": "application/json",


        "Accept": "*/*",   
        "User-Agent": "my-python-app/1", 
        },
                      data = '{"message":{"body":'+ status +'}}')

    f = urllib2.urlopen(req)


speak('Yay')