将POST从请求转换为GAE urlfetch

时间:2015-02-16 07:23:02

标签: python multithreading google-app-engine python-requests

我正在用PayPal付款。以下是requests

的正常工作方式
res = requests.post(get_payment_info_url, headers=headers, data=params)
res_data = res.json()

但是当我尝试使用urlfetch执行相同的请求时,它会给我一个错误(来自PayPal的200回复​​,但付款失败):

res = urlfetch.fetch(url=make_payment_url, payload=params, method=urlfetch.POST, headers=headers)
res_data = json.loads(res)

{u'responseEnvelope': {u'timestamp': u'2015-02-15T23:21:52.729-08:00', u'ack': u'Failure', u'build': u'15089777', u'correlationId': u'e202988541fde'}, 
u'error': [{u'domain': u'PLATFORM', u'message': u'Invalid request: {0}', u'severity': u'Error', u'subdomain': 
u'Application', u'category': u'Application', u'errorId': u'580001'}]}

似乎Google可能正在删除标题或其他内容?如果Google正在这样做,我将如何提出此请求?

最后,是否有任何理由使用urlfetch而不是requests(我已将其本地导入到我的GAE项目中?请求似乎更容易使用'友好'。

2 个答案:

答案 0 :(得分:4)

为此,有效负载需要进行urlencoded。这是有用的:

res2 = urlfetch.fetch(
                 url,
                 headers=headers,
                 method='POST',
                 payload=urllib.urlencode(params)
               )
res2_data = json.loads(res2.content)

答案 1 :(得分:3)

看看https://github.com/paypal/PayPal-Python-SDK我设法轻松修补此lib以使用GAE,如下所述: https://github.com/paypal/PayPal-Python-SDK/issues/66

请求适用于GAE,但仅适用于版本2.3.0(!)

在Google Appengine上(版本1.9.17)requests 版本2.3.0(仅限!) IN PRODUCTION (但不适用于SDK)已启用计费,这将启用套接字支持。

Appengine SDK上的

请求因所有https:// requests:

而失败
  ConnectionError: ('Connection aborted.', error(13, 'Permission denied'))

请求版本2.4.1失败:

  File "distlib/requests/adapters.py", line 407, in send
    raise ConnectionError(err, request=request)
  ConnectionError: ('Connection aborted.', error(13, 'Permission denied'))

请求版本2.5.1失败,并显示:

  File "distlib/requests/adapters.py", line 415, in send
    raise ConnectionError(err, request=request)
  ConnectionError: ('Connection aborted.', error(13, 'Permission denied'))

有关套接字支持的信息:https://cloud.google.com/appengine/docs/python/sockets/