如何在python中使用两足式oauth2发送POST? [英] How do I send a POST using 2-legged oauth2 in python?

查看:220
本文介绍了如何在python中使用两足式oauth2发送POST?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在python中使用2腿式oauth2有一个有效的GET.这是工作 GET代码:

I have a working GET using 2-legged oauth2 in python. Here is the WORKING GET code:

进口:

import oauth2 
import urllib #for url-encode
import urllib2 #for getting and receiving data from server
import time #Unix timestamp import oauth2

通话:

resourceUrl = "https://test.mysite:8443/ess/scheduleapi/v1/people"
request = build_request(resourceUrl,'GET')
u = urllib2.urlopen(request.to_url())
people_data = u.read()

建立请求的功能:

def build_request(url, method):
    params = {                                            
        'oauth_version': "1.0",
        'oauth_nonce': oauth2.generate_nonce(),
        'oauth_timestamp': int(time.time())
    }
    consumer = oauth2.Consumer(key='mykey',secret='mysecret')
    params['oauth_consumer_key'] = consumer.key
    req = oauth2.Request(method=method, url=url, parameters=params)
    signature_method = oauth2.SignatureMethod_HMAC_SHA1()
    req.sign_request(signature_method, consumer, None)
    return req
#end build_request

因此,我认为我可以复制我认为需要的GET部分,并将其与我从一些urllib2文档中获得的语​​法结合起来,并编写出有效的POST.不是这样请记住,我具有相同的导入和相同的build_request函数.这是 Broken 的POST代码.请指教!

So, I thought I could copy the part of the GET that I thought I'd need, plus combine it with the syntax I got off of some urllib2 documentation, and cook up a working POST. Not so. Keep in mind I have the same imports and the same build_request function. Here is the BROKEN POST code. Please advise!

通话:

myurl =  "https://test.mysite:8443/ess/scheduleapi/v1/people" 
myaction = 'POST'
myxml = somexmlIalreadygenerated
person_added, err = post_or_put_me(myaction,myxml,myurl)

POST功能:

def post_or_put_me(action,xml,url)
    request = build_request(url,action) # use same header-generating code as GET did?
    post_data = urllib.urlencode(xml)
    req = urllib2.Request(request,post_data)
    try:
        u = urllib2.urlopen(req)
        post_or_put_returned_data = u.read()
        print 'LENGTH  :', len(post_or_put_returned_data)
        print 'DATA    :', post_or_put_returned_data
    except urllib2.HTTPError, e:
        server_error = 'HTTPError = ' + str(e.code)
    except urllib2.URLError, e:
        server_error = 'URLError = ' + str(e.reason)
    except httplib.HTTPException, e:
        server_error = 'HTTPException'
    except Exception:
        import traceback
        server_error = 'generic exception: ' + traceback.format_exc()
    #endtry

    if server_error:
        err_msg = server_error
    else:   
        succ_msg = 'you had a successful post or put'
    #endif

    return succ_msg, err_msg
#end post_or_put_me

这是我的第二次尝试:

def post_or_put_me(action,xml,url):
    myrequest = build_request(url,'POST')

    CONSUMER_KEY = 'admin_access'
    CONSUMER_SECRET = 'xxxxxxxxxx' 
    consumer = oauth2.Consumer(key=CONSUMER_KEY, secret=CONSUMER_SECRET)
    token = oauth2.Token(key=CONSUMER_KEY, secret=CONSUMER_SECRET)
    client = oauth2.Client(consumer, token)
    resp, content = client.request(
        url,
        method=action,
        body=urllib.urlencode(str(xml)),
        headers= myrequest.headers,
        force_auth_header=True,
    )
    print 'resp, content are', resp, content

推荐答案

以下是有关如何使我的POST或PUT正常工作的实际工作代码,由Echo360 Lecture Capture的Wes Barnes提供.我不希望其他人做两脚的oauth POST/PUT来重新发明轮子.

Here is ACTUAL, WORKING code of how I got my POST or PUT to work, kindly supplied by Wes Barnes from Echo360 Lecture Capture. I don't want anyone else doing a 2-legged oauth POST/PUT to have to reinvent the wheel.

import oauth2 as oauth
import time
import urllib2 as urllib

echo_base_url = 'http://pilot.echo360.com/ess/scheduleapi/v1'

consumer = oauth.Consumer(key ='xxxxx', secret='xxxx')
client = oauth.Client(consumer)
params = "<person><first-name>Jon</first-name><last-name>Doe</last-name><title>Super  Hero</title><email-address>jdoe17@echo360.com</email-address><block-alerts>false</block-alerts><time-zone>US/Eastern</time-zone><locale>en_US</locale><credentials><user-name>jdoe17@echo360.com</user-name><password>password</password></credentials><organization-roles><organization-role><organization-id>b1973c39-dc76-4cab-a4aa-3f9efd628df2</organization-id><role>role-name-admin</role></organization-role></organization-roles></person>"

resp, content = client.request(
                echo_base_url + "/people/",
                method = "PUT",
                body=params,
                headers={'Content-type': 'application/xml'}
                #force_auth_header=True
                )
print resp, content

这篇关于如何在python中使用两足式oauth2发送POST?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆