Requests/httplib/urllib return 3 个不同的结果
Requests/httplib/urllib return 3 different results
我正在通过他们的 HTTP API 向 OrientDB 发出 GET 请求,这似乎 return 3 个上述模块的不同结果。
uri = 'http://localhost:2480/query/Test1/sql/Select from Person'
# Requests
import requests
r = requests.get(uri, auth = ('root', 'root'))
print r.status_code #200
r.json() # Returns the results from the query, all good
# httplib2
import httplib2
h = httplib2.Http()
h.add_credentials('root', 'root')
r = h.request(uri = uri, method = 'GET')
print r
#this returns status 200, but the response itself says 401 unauthorized.
#({'content-location': 'http://localhost:2480/query/Test1/sql/Select from Person',
# 'status': '200'},
# 'from 401 Unauthorized\r\nCache-Control: no-cache, no-store, max-age=0, must-revalidate\r\nPragma: no-cache\r\nDate: Fri Jun 26 10:45:26 IDT 2015\r\nContent-Type: text/plain; charset=utf-8\r\nServer: OrientDB Server v.2.0.8 (build UNKNOWN@r; 2015-04-22 20:47:49+0000)\r\nConnection: Keep-Alive\r\nWWW-Authenticate: Basic realm="OrientDB db-Test1"\r\nSet-Cookie: OSESSIONID=-; Path=/; HttpOnly\r\nContent-Length: 17\r\n\r\n401 Unauthorized.')
# This however returns the correct result, meaning we are authorized!
h.request(uri = 'http://localhost:2480/document/Test1/12:0',
method = 'GET')
#urllib3
import urllib3
http = urllib3.PoolManager()
headers = urllib3.util.make_headers(basic_auth = 'root:root')
r = http.request('GET', uri, headers = headers)
print r.data
# This returns some weird response, definitely not what I got with requests module.
# This isn't the expected from my query either
# 'from 200 OK\r\nCache-Control: no-cache, no-store, max-age=0, must-revalidate\r\nPragma: no-cache\r\nDate: Fri Jun 26 10:51:23 IDT 2015\r\nContent-Type: application/json; charset=utf-8\r\nServer: OrientDB Server v.2.0.8 (build UNKNOWN@r; 2015-04-22 20:47:49+0000)\r\nConnection: Keep-Alive\r\nSet-Cookie: OSESSIONID=OS1435305083836-80491934664057070; Path=/; HttpOnly\r\nContent-Length: 54\r\n\r\n{"result":[{"@type":"d","@rid":"#-2:0","@version":0}]}'
# This however returns actual results
http.request('GET', 'http://localhost:2480/document/Test1/12:0', headers = headers)
我真的不知道这里发生了什么。 运行 来自浏览器的 sql 查询请求 return 是预期的结果,与请求所做的相同。
我也试过 headers 玩了一下,没用....
我分不清是不是有什么问题
- 我的代码
- API
- 我误解了每个模块的用途,因此误用了它们
那么,为什么所有三个模块 return 三个不同的结果,我如何使 httplib 和 urllib return 正确的结果?
谢谢!
编辑 -
阅读 this 后(感谢 dano),我通过手动向请求添加身份验证 headers 通过了 httplib2 的 401 响应。
但是 httplib 仍然 returns 与 urllib 完全相同的响应 - id = -2 的奇怪响应,这没有任何意义。请求仍然是 return 的实际结果。
为什么 Requests 是唯一一个能够获得实际结果的方法?!
我想你看到的 httplib2
是 actually by design;当您提供凭据时,httplib2
不会在其第一个请求中将它们传递给服务器。如果服务器 returns 为 401 状态,它将使用包含的凭据再次尝试。由于看起来您正在返回 200 状态(尽管消息说它是 401),它可能没有发送信用。您可以尝试通过手动将凭据添加到请求的 header 来解决此问题:
import base64
import httplib2
h = httplib2.Http()
auth = base64.encodestring( 'root' + ':' + 'root' )
r = h.request(uri, method='GET',
headers = {'Authorization' : 'Basic ' + auth}
)
我不是 100% 确定,但我的猜测是 urllib3
问题是由于您的 uri 中的空格引起的。看看它是否适用于 http.request_encode_url
而不是 http.request
.
我正在通过他们的 HTTP API 向 OrientDB 发出 GET 请求,这似乎 return 3 个上述模块的不同结果。
uri = 'http://localhost:2480/query/Test1/sql/Select from Person'
# Requests
import requests
r = requests.get(uri, auth = ('root', 'root'))
print r.status_code #200
r.json() # Returns the results from the query, all good
# httplib2
import httplib2
h = httplib2.Http()
h.add_credentials('root', 'root')
r = h.request(uri = uri, method = 'GET')
print r
#this returns status 200, but the response itself says 401 unauthorized.
#({'content-location': 'http://localhost:2480/query/Test1/sql/Select from Person',
# 'status': '200'},
# 'from 401 Unauthorized\r\nCache-Control: no-cache, no-store, max-age=0, must-revalidate\r\nPragma: no-cache\r\nDate: Fri Jun 26 10:45:26 IDT 2015\r\nContent-Type: text/plain; charset=utf-8\r\nServer: OrientDB Server v.2.0.8 (build UNKNOWN@r; 2015-04-22 20:47:49+0000)\r\nConnection: Keep-Alive\r\nWWW-Authenticate: Basic realm="OrientDB db-Test1"\r\nSet-Cookie: OSESSIONID=-; Path=/; HttpOnly\r\nContent-Length: 17\r\n\r\n401 Unauthorized.')
# This however returns the correct result, meaning we are authorized!
h.request(uri = 'http://localhost:2480/document/Test1/12:0',
method = 'GET')
#urllib3
import urllib3
http = urllib3.PoolManager()
headers = urllib3.util.make_headers(basic_auth = 'root:root')
r = http.request('GET', uri, headers = headers)
print r.data
# This returns some weird response, definitely not what I got with requests module.
# This isn't the expected from my query either
# 'from 200 OK\r\nCache-Control: no-cache, no-store, max-age=0, must-revalidate\r\nPragma: no-cache\r\nDate: Fri Jun 26 10:51:23 IDT 2015\r\nContent-Type: application/json; charset=utf-8\r\nServer: OrientDB Server v.2.0.8 (build UNKNOWN@r; 2015-04-22 20:47:49+0000)\r\nConnection: Keep-Alive\r\nSet-Cookie: OSESSIONID=OS1435305083836-80491934664057070; Path=/; HttpOnly\r\nContent-Length: 54\r\n\r\n{"result":[{"@type":"d","@rid":"#-2:0","@version":0}]}'
# This however returns actual results
http.request('GET', 'http://localhost:2480/document/Test1/12:0', headers = headers)
我真的不知道这里发生了什么。 运行 来自浏览器的 sql 查询请求 return 是预期的结果,与请求所做的相同。
我也试过 headers 玩了一下,没用....
我分不清是不是有什么问题
- 我的代码
- API
- 我误解了每个模块的用途,因此误用了它们
那么,为什么所有三个模块 return 三个不同的结果,我如何使 httplib 和 urllib return 正确的结果?
谢谢!
编辑 -
阅读 this 后(感谢 dano),我通过手动向请求添加身份验证 headers 通过了 httplib2 的 401 响应。
但是 httplib 仍然 returns 与 urllib 完全相同的响应 - id = -2 的奇怪响应,这没有任何意义。请求仍然是 return 的实际结果。
为什么 Requests 是唯一一个能够获得实际结果的方法?!
我想你看到的 httplib2
是 actually by design;当您提供凭据时,httplib2
不会在其第一个请求中将它们传递给服务器。如果服务器 returns 为 401 状态,它将使用包含的凭据再次尝试。由于看起来您正在返回 200 状态(尽管消息说它是 401),它可能没有发送信用。您可以尝试通过手动将凭据添加到请求的 header 来解决此问题:
import base64
import httplib2
h = httplib2.Http()
auth = base64.encodestring( 'root' + ':' + 'root' )
r = h.request(uri, method='GET',
headers = {'Authorization' : 'Basic ' + auth}
)
我不是 100% 确定,但我的猜测是 urllib3
问题是由于您的 uri 中的空格引起的。看看它是否适用于 http.request_encode_url
而不是 http.request
.