Кодирование запроса OData как URL - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь закодировать запрос odata с различными параметрами фильтра в python. Версия запроса в виде простой строки выглядит примерно так:

*endpoint*?$filter=datecolumn gt 2019-01-01T00:00:00Z

Чтобы фактически запросить данные с сервера, мне нужно отформатировать строку как URL, который я могу передать в запросе. Версия URL выглядит следующим образом:

*endpoint*?%24filter=datecolumn%20gt%'2019-01-01T00:00:00Z

Чтобы легко получить URL-версию строки в Python, я изначально пытался использовать пакет urllib:

import urllib
urllib.parse.quote('?$filter=datecolumn gt 2019-01-01T00:00:00Z')

но это, кажется, переформатирует строку. Он заменяет символы, такие как начальный знак доллара и знак равенства, их аналогами в кодировке URL, что делает мой запрос по одатам неработающим. Есть ли в python метод или какие-либо пакеты, которые можно использовать для легкого кодирования строки для запросов оддаты?

Как правило, существует ли имя для типа кодировки, используемого odata в запросе?

Ответы [ 2 ]

0 голосов
/ 27 июля 2019

В последнее время я заинтересовался этим и поиграл с печально известным образцом службы Northwind, и, хотя есть несколько пакетов python, которые я хотел попробовать, сначала я подумал, что увижу, как далеко я могу добраться только с помощью запросов и встроенного python. .

Вы можете видеть, что форматирование строк URL так же просто, как говорит Hoang HUA, - ​​и я даже не использую «полную силу» команд, доступных с запросами [Примечание: манипуляции с таблицей выполняются на стороне клиента и этот код грубой силы все еще очень короткий]:

import requests
import operator

def make_HTTP_request(url):
    r = requests.get(url)
    return r.json()

srvc_root = 'https://services.odata.org/V4/Northwind/Northwind.svc'

order_date = '1998-01-01T00:00:00Z'
filter = '$filter=OrderDate gt {} and RequiredDate lt ShippedDate'.format(order_date)
orders_qry = '$select=OrderID,CustomerID,EmployeeID&{}'.format(filter)
url_orders_qry = '{}/Orders?{}'.format(srvc_root, orders_qry)
urldict_orders = make_HTTP_request(url_orders_qry)

customerIDs = []
employeeIDs = []

for order in urldict_orders['value']:
    customerIDs.append(order['CustomerID'])
    employeeIDs.append(str(order['EmployeeID']))

customer_qry = '$select={}&$filter=CustomerID eq \'{}\''.format('CustomerID,CompanyName', '\' or CustomerID eq \''.join(customerIDs))
url_customers_qry = '{}/Customers?{}'.format(srvc_root, customer_qry)
urldict_customers = make_HTTP_request(url_customers_qry)

employee_qry = '$select={}&$filter=EmployeeID eq {}'.format('EmployeeID,FirstName,LastName', ' or EmployeeID eq '.join(employeeIDs))
url_employees_qry = '{}/Employees?{}'.format(srvc_root, employee_qry)
urldict_employees = make_HTTP_request(url_employees_qry)

dict_customers = {}
dict_employees = {}
dict_orders = {}

for cust in urldict_customers['value']:
    dict_customers[cust['CustomerID']] = cust['CompanyName']

for emp in urldict_employees['value']:
    dict_employees[emp['EmployeeID']] = '{} {}'.format(emp['FirstName'], emp['LastName'])

for order in urldict_orders['value']:
    dict_orders[order['OrderID']] = (dict_customers[order['CustomerID']], dict_employees[order['EmployeeID']])

for orders in sorted(dict_orders.items(), key=operator.itemgetter(1)):
    print('{0:7d}  {1:30s}{2:30s}'.format(orders[0], orders[1][0], orders[1][1]))

Это вывод - 8 строк (кортежей) из 3 столбцов (атрибутов) в 3 таблицах (объектах):

  10924  Berglunds snabbköp            Janet Leverling               
  10827  Bon app'                      Nancy Davolio                 
  10970  Bólido Comidas preparadas     Anne Dodsworth                
  10816  Great Lakes Food Market       Margaret Peacock              
  10960  HILARION-Abastos              Janet Leverling               
  10927  La corne d'abondance          Margaret Peacock              
  10828  Rancho grande                 Anne Dodsworth                
  10847  Save-a-lot Markets            Margaret Peacock

Кстати, при выполнении в локальной базе данных PostgreSQL копии Northwind это эквивалентный SQL:

SELECT
    O.order_id, C.company_name,
    E.first_name || ' ' || E.last_name AS Employee
FROM
    orders O JOIN employees E ON O.employee_id = E.employee_id
    JOIN customers C ON O.customer_id = C.customer_id
WHERE
    O.order_date > '1998-01-01' AND O.shipped_date > O.required_date
ORDER BY
    C.company_name;
0 голосов
/ 19 июня 2019

Поскольку "$" и "=" являются специальными символами (в соответствии с https://tools.ietf.org/html/rfc3986#section-2.2), нам не нужно их кодировать. Я бы сказал, что вы должны кодировать значение ("datecolumn gt 2019-01 -01T00: 00: 00Z ").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...