我有一个服务,它公开了用于登录的API。在我的浏览器中,如果我这样做
<host>:<port>/myservice/api/login?u=admin&pw=admin
上面的url,返回一张票,我可以传递给我的连续请求。
More details about the same, here.
下面是我的python脚本。
import urllib
url = 'http://<host>:<port>/myservice/api/login?u=admin&pw=admin'
print 'Retrieving', url
uh = urllib.urlopen(url)
data = uh.read()
print 'Retrieved',len(data),'characters'
print data
当我跑步时,我得到了
IOError: ('http error', 401, 'Authorization Required', <httplib.HTTPMessage instance at 0x<somenumber>>)
现在,我不确定我应该做什么。所以我去了我的浏览器,打开了开发人员的控制台。
显然,网址已转移到其他地方。我看到了两个请求。
第一个击中我正在击打的网址。响应标头有一个位置:参数。
第二个请求命中作为Location参数返回的url。 Authorization标头有'Negotiation
它在响应标题中也有一个setcookie。
现在,我不确定这些信息到底是什么,但是如果有人可以提供帮助的话。感谢
答案 0 :(得分:2)
我认为您的问题是登录服务的URL错误
如果我将代码更改为:
import urllib, json
url = 'http://localhost:8080/alfresco/service/api/login?u=admin&pw=admin&format=json'
print "Retrieving %s" % url
uh = urllib.urlopen(url)
data = uh.read()
print "Retrieved %d characters" % len(data)
print "Data is %s" % data
ticket = json.loads(data)["data"]["ticket"]
print "Ticket is %s" % ticket
然后针对新安装的Alfresco 4.2服务器,我获得了admin用户的登录Ticket。
注意使用登录API的json格式 - 更容易从JSON解析,以及登录api的正确路径 - /alfresco/service/api/login
答案 1 :(得分:1)
尝试这两个小改动可能会有所帮助:
1)在传递参数以请求url时使用urllib.urlencode
import urllib
params = urllib.urlencode({'u': 'admin', 'pw': 'admin'})
uh = urllib.urlopen("http://<host>:<port>/myservice/api/login?%s" % params')
2)使用urllib2
发出请求时刺激网络浏览器import urllib2
req = urllib2.Request('http://<host>:<port>/myservice/api/login?u=admin&pw=admin', headers={ 'User-Agent': 'Mozilla/5.0' })
uh = urllib2.urlopen(req)
答案 2 :(得分:0)