2015-06-26 41 views
2

我正在通過他們的HTTP API向OrientDB發出一個GET請求,這似乎返回3個不同的結果與上述3個模塊。請求/ httplib/urllib返回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 [email protected]; 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 [email protected]; 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查詢請求會返回預期的結果,請求也是如此。

我也試着打了一下,用頭,並沒有幫助....

我不能告訴,如果有什麼問題

  • 我的代碼
  • 的API
  • 我誤解每個模塊的目的,因此濫用他們

那麼,爲什麼所有的三個MODU les返回三個不同的結果,並且如何讓httplib & urllib返回正確的結果?

謝謝!

編輯 -

讀取this(感謝達諾)後,我通過手動添加認證報頭以請求中傳遞與httplib2的401響應。

但是,httplib仍然返回與urllib完全相同的響應 - id = -2的奇怪響應,這意味着什麼。請求仍會返回實際結果。

爲什麼Requests是唯一能夠獲得實際結果的人?

回答

1

我認爲你所看到的是actually by design;當您提供憑據時,不會在第一次請求時將它們傳遞給服務器。如果服務器返回401狀態,它將再次嘗試使用包含的憑據。因爲它看起來像是回到了200的狀態(儘管有消息說它是401),但它可能不會發送這些信號。您可以嘗試通過手動添加憑據您的請求頭解決它:

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

+0

所以這是一個改進 - 現在httplib傳遞auth部分,並返回與urllib完全相同的響應 - id = -2的奇怪響應。 請求如何管理得到正確的結果,而httplib&urllib不? – thomas

+0

哦,我完全錯過了答案的第二部分。空白是原因!手動將它們替換爲%20通過httplib&urllib獲得了正確的響應。 request_encode_url沒有幫助,我會檢查爲什麼 – thomas

+1

@thomas酷,很高興你有它的工作。真的,這似乎更多的證據總是使用'request'作爲你的HTTP客戶端。 :) – dano

相關問題