【问题标题】:Python HTTP Request Binary Data using RequestsPython HTTP 使用请求请求二进制数据
【发布时间】:2014-07-15 10:23:08
【问题描述】:

以下代码仅适用于 curl。如果你能告诉我为什么它不能使用请求在 Python 中工作,那就太好了

curl 'http://cdcnepal.com/Modules/HOmeMoviesLists/WebService2.asmx/GetShowsByDate' \
 -H 'Content-Type: application/json; charset=UTF-8' \
 -d '{"portalId":"1","showDate":"26/05/2014","flag":0,"size":9}'

但是在 Python 中使用以下代码

import requests
import json
url = """http://cdcnepal.com/Modules/HOmeMoviesLists/WebService2.asmx/GetShowsByDate"""
headers = {"content-type":["application/json", "charset=UTF-8"]}
payload = {"portalId":"1","showDate":"26/05/2014","flag":0,"size":9}
r = requests.get(url, headers=headers, data=payload)
print r.text

最初 curl 请求还有其他内容,如下所示,但我意识到我可以删除几个。我不确定这是导致错误的原因,因为 curl 请求正在运行。我没有从两个代码中得到相同的响应。

这可能很有用。从 Chrome 开发工具中提取的 Curl Requests

curl 'http://cdcnepal.com/Modules/HOmeMoviesLists/WebService2.asmx/GetShowsByDate'
 -H 'Cookie: OriginalReferrer=https://www.google.com/;
     OriginalURL=http://cdcnepal.com/;
     ASP.NET_SessionId=i5lbnql5hpp0wm1ywyqbywtj;
     VisitCount=4' 
 -H 'Origin: http://cdcnepal.com' 
 -H 'Accept-Encoding: gzip,deflate,sdch' 
 -H 'Accept-Language: en-US,en;q=0.8,hi;q=0.6' 
 -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3)
     AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36' 
 -H 'Content-Type: application/json; charset=UTF-8' 
 -H 'Accept: application/json, text/javascript, */*; q=0.01' 
 -H 'Referer:http://cdcnepal.com/Home.aspx' 
 -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' 
 -H 'DNT: 1' 
 --data-binary '{"portalId":"1","showDate":"27/05/2014","flag":0,"size":9}' --compressed

【问题讨论】:

    标签: python http curl python-requests url-parameters


    【解决方案1】:

    curl-d 开关发送 POST 请求,但您使用 requests.get() 代替,发送 GET 请求(其正文被忽略)。

    改为使用 POST,使用 request.post():

    import requests
    import json
    
    url = "http://cdcnepal.com/Modules/HOmeMoviesLists/WebService2.asmx/GetShowsByDate"
    headers = {"content-type": "application/json; charset=UTF-8"}
    payload = {"portalId":"1","showDate":"26/05/2014","flag":0,"size":9}
    r = requests.post(url, headers=headers, data=json.dumps(payload))
    print r.text
    

    您还需要:

    1. 不使用content-type 标头的列表,不支持单独指定参数。
    2. 将您的 JSON 数据编码为 JSON 字符串; requests 不会为您执行此操作。相反,传递给data 的字典被编码为application/x-www-form-urlencoded 数据。

    您可以使用http://httpbin.org/post 更轻松地将curl 命令与requests 进行比较:

    $ curl http://httpbin.org/post \
    >  -H 'Content-Type: application/json; charset=UTF-8' \
    >  -d '{"portalId":"1","showDate":"26/05/2014","flag":0,"size":9}'
    
    {
      "args": {},
      "data": "{\"portalId\":\"1\",\"showDate\":\"26/05/2014\",\"flag\":0,\"size\":9}",
      "files": {},
      "form": {},
      "headers": {
        "Accept": "*/*",
        "Connection": "close",
        "Content-Length": "58",
        "Content-Type": "application/json; charset=UTF-8",
        "Host": "httpbin.org",
        "User-Agent": "curl/7.30.0",
        "X-Request-Id": "78d7bb7d-e29b-482b-908a-48d2395a050f"
      },
      "json": {
        "flag": 0,
        "portalId": "1",
        "showDate": "26/05/2014",
        "size": 9
      },
      "origin": "84.92.98.170",
      "url": "http://httpbin.org/post"
    }
    

    >>> import requests
    >>> import json
    >>> from pprint import pprint
    >>> url = 'http://httpbin.org/post'
    >>> headers = {"content-type":"application/json; charset=UTF-8"}
    >>> payload = {"portalId":"1","showDate":"26/05/2014","flag":0,"size":9}
    >>> r = requests.post(url, headers=headers, data=json.dumps(payload))
    >>> pprint(r.json())
    {u'args': {},
     u'data': u'{"portalId": "1", "flag": 0, "size": 9, "showDate": "26/05/2014"}',
     u'files': {},
     u'form': {},
     u'headers': {u'Accept': u'*/*',
                  u'Accept-Encoding': u'gzip, deflate, compress',
                  u'Connection': u'close',
                  u'Content-Length': u'65',
                  u'Content-Type': u'application/json; charset=UTF-8',
                  u'Host': u'httpbin.org',
                  u'User-Agent': u'python-requests/2.2.1 CPython/2.7.6 Darwin/13.1.0',
                  u'X-Request-Id': u'06d6b542-c279-4898-8701-2c0d502aa36e'},
     u'json': {u'flag': 0,
               u'portalId': u'1',
               u'showDate': u'26/05/2014',
               u'size': 9},
     u'origin': u'84.92.98.170',
     u'url': u'http://httpbin.org/post'}
    

    两种情况都显示返回相同的 json 字典。

    如果您使用requests 2.4.2 或更高版本,您也可以将JSON 编码留给库;如果您将要发送的数据作为 json 关键字参数传递,它也会设置正确的 Content-Type 标头:

    import requests
    
    url = "http://cdcnepal.com/Modules/HOmeMoviesLists/WebService2.asmx/GetShowsByDate"
    payload = {"portalId":"1","showDate":"26/05/2014","flag":0,"size":9}
    r = requests.post(url, json=payload)
    print r.text
    

    【讨论】:

    • 我尝试了你所说的,但我收到一个错误 [{"Message":"处理请求时出错。","StackTrace":"","ExceptionType":"" }] 甚至尝试添加 cUrl 的用户代理也没有用.. 还有什么我可以尝试的吗?
    • @ShapNepal:我为您的 URL 得到与 CURL 响应完全相同的 JSON 响应。它对我有用。
    • @ShapNepal:确保您的代码与我的回答相匹配;如果我将答案开头的代码复制并粘贴到 Python 交互式解释器中,它会打印出完整的 JSON 响应。
    • 是的!!,它在 iPython 中工作,有趣的是,我使用的是 Sublime Text 3,它给了我一个错误。谢谢大家!
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 2012-07-24
    相关资源
    最近更新 更多