【问题标题】:python requests error 422python请求错误422
【发布时间】:2015-08-13 12:35:29
【问题描述】:

我正在尝试通过 rest api 发布请求结构。

我的代码:

def pack_orders(self, orderItemId, invoiceDate, invoiceNumber, tax, serialNumbers=None, subOrderItemId = None, subSerialNumbers = None, subInvoiceDate = None, subTax = None):
    url = "https://api.flipkart.net/sellers/orders/labels"
    payload = {[{"orderItemId": orderItemId,
                "serialNumbers": serialNumbers,
                "invoiceDate": invoiceDate,
                "invoiceNumber": invoiceNumber,
                "tax": tax,
                "subItems": [{
                    "orderItemId": subOrderItemId,
                    "serialNumbers": subSerialNumbers,
                    "invoiceDate": subInvoiceDate,
                    "tax": subTax}]
                }],}
    return self.session.post(url, params=payload)

调用上述函数:

label = fk.pack_orders(orderItemId='232519872', invoiceDate='2015-08-13',       invoiceNumber='INVSTR01', tax=5)
print label.status_code
print label.url
print label.content

它抛出错误 422。我知道它必须对请求参数结构做一些事情。我无法查明错误的来源。

这里是任何帮助的文档链接。 Documentation

【问题讨论】:

    标签: python python-requests


    【解决方案1】:

    API 需要 JSON 格式的数据。
    另外python requests简单易用。

    import requests
    
    data = {[{"orderItemId": orderItemId,
                    "serialNumbers": serialNumbers,
                    "invoiceDate": invoiceDate,
                    "invoiceNumber": invoiceNumber,
                    "tax": tax,
                    "subItems": [{
                        "orderItemId": subOrderItemId,
                        "serialNumbers": subSerialNumbers,
                        "invoiceDate": subInvoiceDate,
                        "tax": subTax}]
                    }],}
    
    r = requests.post(url, json=data)
    r.status_code
    r.json()
    


    示例请求(使用 shell):

    成功提出请求。获得 401 无效身份验证(原因很明显)

    In [19]: import requests
    
    In [20]: url = "https://api.flipkart.net/sellers/orders/labels"
    
    In [21]: data = [{
       ....:     "orderItemId": 1179576,
       ....:     "serialNumbers": ["IMEI1-UNIT1"],
       ....:     "invoiceDate": "2014-08-29",
       ....:     "invoiceNumber": "INV-01",
       ....:     "tax": 100.98,
       ....:     "subItems": [{
       ....:         "orderItemId": 1173467,
       ....:         "serialNumbers": [ ],
       ....:         "invoiceDate":  "2014-08-29",
       ....:         "tax": 10.98
       ....:     }]
       ....: }]
    
    In [22]: r = requests.post(url, json=data)
    
    In [23]: r.status_code
    Out[23]: 401
    
    In [24]: r.json()
    Out[24]: 
    {u'error': u'unauthorized',
     u'error_description': u'An Authentication object was not found in the SecurityContext'}
    

    【讨论】:

    • 它说的是不可散列的类型列表
    • 我的错。将其从 json.loads(data) 更改为 json.dumps(data)
    • 添加了示例数据以供参考。
    • 请注意,requests 方法现在接受 json 参数,即 a) 将 Python 结构编码为 JSON,b) 为您设置 Content-Type 标头:r = requests.post(url, json=data)
    • @ParagTyagi-morpheus-: 它适用于任何一个; requests 是一个外部库。 requests 版本 2.4.2 中添加了对 json 关键字的支持。
    【解决方案2】:

    你应该试试:

    return self.session.post(url, data=payload)
    

    而不是

    return self.session.post(url, params=payload)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-20
      • 2021-12-19
      • 2016-10-23
      • 2020-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      相关资源
      最近更新 更多