【问题标题】:Curl to Python Request - Json卷曲到 Python 请求 - Json
【发布时间】:2018-07-08 14:26:32
【问题描述】:

我想将此 Curl 代码转换为 Python 请求。

curl -X POST https://KEY:SECRET@www.sendowl.com/api/v1/products.xml -F 
"product[name]=Test" -F "product[product_type]=digital" -F 
"product[price]=12.50" -F "product[attachment]=@/filepath.png"

这是我所拥有的,但我收到 500 错误

    from requests_oauthlib import OAuth1Session
    import requests
    from requests_oauthlib import OAuth1
    import json
    from oauthlib.oauth1 import SIGNATURE_TYPE_QUERY, SIGNATURE_TYPE_BODY
    from requests_toolbelt import MultipartEncoder

    url = 'https://KEY:SECRET@www.sendowl.com/api/v1/products' # Yes i did put Key and secret 
    headers = {"Accept": "application/json"}    
    payload = {'product[name]': 'test','product[product_type]': 'digital','product[price]': '23','product[attachment]': ('C:\Users\APPE\Desktop\SendOWL\\audi.jpg', open('C:\Users\APPE\Desktop\SendOWL\\audi.jpg', 'rb'),)}


    result = requests.post(url,headers=headers, params=payload)

【问题讨论】:

    标签: python json curl python-requests


    【解决方案1】:
    • curl 中,-F--form 参数用于发布多部分表单数据(文件)。在requests 中,您可以使用files 参数发布文件。

    • requests 中,params 参数用于查询字符串数据。如果要在 POST 请求的正文中发送数据,则应使用 data 参数。

    • 对于基本身份验证,您可以只使用auth 参数。

    所以,你的 python 代码应该是这样的,

    import requests
    
    url = 'https://www.sendowl.com/api/v1/products.xml' 
    headers = {"Accept": "application/json"}   
    auth = ('KEY', 'SECRET') 
    data = {'product[name]':'test', 'product[product_type]':'digital', 'product[price]':'23'}
    files = {'product[attachment]': open('C:\Users\APPE\Desktop\SendOWL\\audi.jpg', 'rb')}
    r = requests.post(url, auth=auth, headers=headers, data=data, files=files)
    
    print(r.text)
    

    【讨论】:

    • 哇,谢谢你的解释和例子 :) 你是一个救星。
    • 这可能是一个很长的镜头,但我收到一个 403 错误并且当输出弹出时。我在标题中得到一个巨大的 html 文件,它说你是人类。这是否意味着身份验证不正确?
    • 否,403 表示禁止,身份验证错误将返回 401。尝试使用 headers 中的用户代理,例如 headers = {"Accept": "application/json", "User-Agent":"Mozilla/5.0 (Windows NT 6.1; rv:58.0) Gecko/20100101 Firefox/58.0"}
    • 另外,我认为你的网址有误 - 应该是 /api/v1/products.xml。我之前错过了,更新了代码
    • 我想通了。最后一部分需要 r = requests.post(url, auth=auth, headers=headers, data=data, files=files).json()。再次感谢您的帮助。很长一段时间我都对 cURL 感到困惑。大声笑
    猜你喜欢
    • 2014-11-11
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多