2015-06-26 5 views
2

Я делаю запрос GET в OrientDB через их HTTP API, который, кажется, возвращает 3 разных результата с тремя вышеупомянутыми модулями.Запросы/httplib/urllib 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 [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 из браузера возвращает ожидаемые результаты, то же самое сделали запросы.

Я также пытался играть немного с заголовками, не помогло ....

Я не могу сказать, если что-то не так с

  • Мой код
  • АНИ
  • меня непонимание цели каждого модуля, и, следовательно, злоупотребляя их

Итак, почему это, что все три ПБУ les возвращают три разных результата, и как мне сделать httplib & urllib возвращает правильные результаты?

Спасибо!

Edit -

После прочтения this (спасибо Дано), я прошел 401 ответ с httplib2 вручную путем добавления заголовков проверки подлинности запроса.

Однако httplib по-прежнему возвращает тот же самый ответ urllib делает - странный отклик с id = -2, что ничего не значит. Запросы все еще возвращают фактические результаты.

Почему только запросы, которым удается получить фактические результаты?

ответ

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 Cool, рад, что у вас это работает. Действительно, это просто похоже на то, чтобы всегда использовать «запросы» в качестве вашего HTTP-клиента. :) – dano