【问题标题】:Convert a curl POST request to Python only using standard library仅使用标准库将 curl POST 请求转换为 Python
【发布时间】:2010-12-31 17:59:45
【问题描述】:

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

curl -u 7898678:X -H 'Content-Type: application/json' \
-d '{"message":{"body":"TEXT"}}' http://sample.com/36576/speak.json

TEXT 是我想用脚本其余部分生成的消息替换的内容。(这已经是合理的,尽管我认为它不遵循最佳实践或特殊性可靠。-需要找出如何正确地学习编程(即不使用谷歌组装东西))

如果可能的话,我希望它与标准库一起使用。

【问题讨论】:

标签: python json curl


【解决方案1】:

【讨论】:

    【解决方案2】:

    如果可能的话,我希望它与标准库一起使用。

    标准库提供 urllibhttplib 用于处理 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()

    import os
    TEXT = ...
    cmd = """curl -u 7898678:X -H 'Content-Type: application/json'""" \
      """-d '{"message":{"body":"%{t}"}}' http://sample.com/36576/speak.json""" % \
      {'t': TEXT}
    

    如果您愿意放宽仅限标准库的限制,可以使用PycURL。请注意,它不是 Python 风格的(它几乎只是 libcurl 的薄薄的一层),而且我不确定它与 Python 3 的兼容性如何。

    【讨论】:

    • 使用 httplib 意味着跳过 urllib 和 urllib2 的一些特性,比如对代理的支持。
    • @dalke » 确实如此;这只是发出GETPOST 请求的简单示例,我认为这是OP 所追求的。
    • 这是真的。我只是发现使用 httplib 和进行 URL 修改通常不值得付出努力,因为 urllib2 可以为您提供所有这些以及更多。
    【解决方案3】:

    虽然有一些方法可以处理authentication in urllib2,但如果您正在执行基本授权(这意味着以明文形式有效地发送用户名和密码),那么您可以使用 urllib2.Request 和 urllib2 完成所有您想做的事情。网址打开:

    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)
    

    我使用netcat 对此进行了测试,因此我可以看到发送的数据除了排序顺序外,在两种情况下都是相同的。这里第一个是用 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 路径。)

    没有必要使用底层的 httplib,它不支持 urllib2 给你的东西,比如代理支持。另一方面,我确实发现 urllib2 在这种简单的请求之外很复杂,如果您想要更好地支持发送哪些标头以及发送它们的顺序,请使用 httplib。

    【讨论】:

      【解决方案4】:

      谢谢大家

      这行得通

      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')
      

      【讨论】:

        猜你喜欢
        • 2023-03-20
        • 1970-01-01
        • 2021-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-30
        • 2020-03-18
        相关资源
        最近更新 更多