将curl调用转换为python请求

帕维尔斯

我将curl请求转换为Python请求调用时遇到问题:

以下是curl调用的外观:(摘自:http : //developers.payu.com/en/restapi.html#creating_new_order_api

curl -X POST https://secure.payu.com/api/v2_1/orders \
-H "Content-Type: application/json" \
-H "Authorization: Bearer 3e5cac39-7e38-4139-8fd6-30adc06a61bd" \
-d '{
    "notifyUrl": "https://your.eshop.com/notify",
    "customerIp": "127.0.0.1",
    "merchantPosId": "145227",
    "description": "RTV market",
    "currencyCode": "PLN",
    "totalAmount": "21000",
    "products": [
        {
            "name": "Wireless Mouse for Laptop",
            "unitPrice": "15000",
            "quantity": "1"
        },
        {
            "name": "HDMI cable",
            "unitPrice": "6000",
            "quantity": "1"
        }
    ]
}'

这是我在请求中写的:

import json
import requests
headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer 3e5cac39-7e38-4139-8fd6-30adc06a61bd',
}

data = {
    "notifyUrl": "https://your.eshop.com/notify",
    "customerIp": "127.0.0.1",
    "merchantPosId": "145227",
    "description": "RTV market",
    "currencyCode": "PLN",
    "totalAmount": "21000",
    "products": [
        {
            "name": "Wireless Mouse for Laptop",
            "unitPrice": "15000",
            "quantity": "1"
        },
        {
             "name": "HDMI cable",
             "unitPrice": "6000",
             "quantity": "1"
        }
    ]
}

resp2 = requests.post('https://secure.payu.com/api/v2_1/orders', headers=headers, json=data)
print(resp2.json())

卷曲作为响应打印出来:

{"orderId":"V6GRPMNRLR160429GUEST000P01","status":{"statusCode":"SUCCESS"},"redirectUri":"https://secure.payu.com/pl/standard/co/summary?sessionId=HtnLqVtBJ5tcOKG2nX03TKwAXOYtXPHe&merchantPosId=145227&timeStamp=1461948331350&showLoginDialog=false&apiToken=9f31fcd1d0d1c5fde8aa57c2b16b5d6bbdfe81543a5f6a12cd39955a487fdaab"}

而python请求:

/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:315: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#snimissingwarning.        
  SNIMissingWarning                                                                                                                                                                                                       
/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:120: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.                                                                           
  InsecurePlatformWarning                                                                                                                                                                                                 
Traceback (most recent call last):                                                                                                                                                                                        
  File "/home/ubuntu/workspace/src/billing/testapi.py", line 30, in <module>                                                                                                                                              
    print(resp2.json())                                                                                                                                                                                                   
  File "/usr/local/lib/python2.7/dist-packages/requests/models.py", line 808, in json                                                                                                                                     
    return complexjson.loads(self.text, **kwargs)                                                                                                                                                                         
  File "/usr/lib/python2.7/dist-packages/simplejson/__init__.py", line 488, in loads                                                                                                                                      
    return _default_decoder.decode(s)                                                                                                                                                                                     
  File "/usr/lib/python2.7/dist-packages/simplejson/decoder.py", line 370, in decode                                                                                                                                      
    obj, end = self.raw_decode(s)                                                                                                                                                                                         
  File "/usr/lib/python2.7/dist-packages/simplejson/decoder.py", line 389, in raw_decode                                                                                                                                  
    return self.scan_once(s, idx=_w(s, idx).end())                                                                                                                                                                        
simplejson.scanner.JSONDecodeError: Expecting value: line 8 column 1 (char 7)   

有谁知道为什么它不能处理请求?谢谢

马丁·彼得斯(Martijn Pieters)

该站点以302状态代码响应,其中包括Location标头:

>>> resp = requests.post('https://secure.payu.com/api/v2_1/orders', headers=headers, json=data)
>>> resp.history
[<Response [302]>, <Response [302]>]
>>> resp.history[0].headers['location']
'https://secure.payu.com/pl/standard/co/summary?sessionId=rrQ97fR2bxQJhUqCDORCbRa0uA4WlxJi&merchantPosId=145227&timeStamp=1461950205252&showLoginDialog=false&apiToken=f3599eca78ad55a16d84608e69f3ac7458b782598b064b337be07e8bd6c2c1d5'
>>> resp.history[0].text
u'{"orderId":"Z9W2H77TVD160429GUEST000P01","status":{"statusCode":"SUCCESS"},"redirectUri":"https://secure.payu.com/pl/standard/co/summary?sessionId=rrQ97fR2bxQJhUqCDORCbRa0uA4WlxJi&merchantPosId=145227&timeStamp=1461950205252&showLoginDialog=false&apiToken=f3599eca78ad55a16d84608e69f3ac7458b782598b064b337be07e8bd6c2c1d5"}'

您可以通过查看response.history包含先前请求列表来查看重定向历史记录(就像我在上面所做的那样)resp.history[0]是这里的最初回应。请参阅文档中的重定向和历史记录。

请注意,数据是正确的有初始响应。

当您使用任何 Accept-Encoding标题时,网站都会执行此操作如果添加,您将得到相同的结果

-H "Accept-Encoding: gzip, deflate"

curl命令,或通过将相同的标头(具有任何值)添加到提供的payu.apiari.io控制台中(单击标,然后添加Accept-Encoding标头并标头添加一个值)。

您应该将此视为站点中的错误,因为指定header是完全正常的事情实际上,如果您自己忽略该标头,则Pythonhttplib库(由间接使用requests为该标头设置默认值,因此requests甚至无法关闭该标头因此,我已将此错误报告给PayU。

作为一种变通方法,您可以使用response.history[0]引用,或者更好的是,告诉请求不要一开始就遵循重定向:

>>> resp = requests.post('https://secure.payu.com/api/v2_1/orders', headers=headers, json=data, allow_redirects=False)
>>> resp.json()
{u'orderId': u'NBWTP5WNKK160429GUEST000P01', u'status': {u'statusCode': u'SUCCESS'}, u'redirectUri': u'https://secure.payu.com/pl/standard/co/summary?sessionId=PcvceJHf5En60Dier5gKxCyExiva4qh0&merchantPosId=145227&timeStamp=1461950329704&showLoginDialog=false&apiToken=5962ef901010ca4f8ef6491619217c060f4d53ed0d8e4eadb513d4e0811fc992'}

但是请注意,忽略302可能会干扰正常的状态代码,我看到302可能表示需要其他安全信息

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将curl调用转换为python请求

来自分类Dev

如何将curl调用转换为python请求调用

来自分类Dev

将curl转换为python请求

来自分类Dev

将基本的CURL转换为Python的请求

来自分类Dev

将Geoserver cURL转换为python请求

来自分类Dev

将curl转换为python请求

来自分类Dev

将curl请求转换为python

来自分类Dev

将Geoserver cURL转换为python请求

来自分类Dev

将cURL转换为Python请求

来自分类Dev

将curl调用转换为法拉第请求

来自分类Dev

将cURL请求转换为Python-Requests请求

来自分类Dev

将 CURL 请求转换为 PHP CURL

来自分类Dev

将cURL请求转换为Guzzle请求

来自分类Dev

将curl命令转换为python pycurl或请求

来自分类Dev

在Python中使用multipart / mixed将curl转换为请求

来自分类Dev

使用--form将curl转换为python请求

来自分类Dev

如何将实际文件的curl转换为python请求?

来自分类Dev

将 PHP Curl 查询转换为 Python 请求

来自分类Dev

如何将 curl 请求转换为 python?

来自分类Dev

使用请求将 cURL 命令转换为 python

来自分类Dev

将CURL转换为AJAX请求

来自分类Dev

将cURL请求转换为PHP

来自分类Dev

将curl查询转换为请求

来自分类Dev

将 PHP cURL 请求转换为 Ruby

来自分类Dev

将 cURL 请求转换为 PHP

来自分类Dev

将curl转换为python

来自分类Dev

将curl命令转换为AFNetworking调用

来自分类Dev

将cURL调用转换为Java

来自分类Dev

将curl API调用转换为httparty