Как вы используете POST URI в Python? - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь использовать POST URI в моем коде для доступа к инструменту аннотатора NCBO. Мой текущий код представляет собой запрос GET, но я не знаю, как отформатировать его в запрос POST. Мои данные - текстовая переменная.

Все примеры, которые я видел, используют request.get(url) -> request.post(url, data=data), но как я могу сделать это для build_opener() и json.loads()?

Вот мой код:

def get_json(url):
#get annotations
    opener = urllib.request.build_opener()
    opener.addheaders = [('Authorization', 'apikey token=' + API_KEY)]
    return json.loads(opener.open(url).read())

text = "random text with a lot of words"
annotations = get_json("http://data.bioontology.org/annotator?text=" + urllib.parse.quote(text))

Обновленный код:

def get_annotations(text, url):
    headers = [('Authorization', 'apikey token=' + API_KEY)]
    data = text

    response = requests.request("POST",url,headers=headers,data=data)
    return response.text.encode('utf-8')

annotations = get_annotations(text, "http://data.bioontology.org/annotator?text=" + urllib.parse.quote(text))

Ошибка:

    response = requests.request("POST",url,headers=headers,data=data)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/requests/api.py", line 61, in request
    return session.request(method=method, url=url, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/requests/sessions.py", line 516, in request
    prep = self.prepare_request(req)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/requests/sessions.py", line 449, in prepare_request
    p.prepare(
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/requests/models.py", line 315, in prepare
    self.prepare_headers(headers)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/requests/models.py", line 447, in prepare_headers
    for header in headers.items():
AttributeError: 'list' object has no attribute 'items'

1 Ответ

0 голосов
/ 07 апреля 2020

Я рекомендую вам импортировать модуль запросов, этот модуль легко выбрать способ запроса.

import requests
def get_json(url):
    headers = [('Authorization', 'apikey token=' + API_KEY)]  #add headers here
    data = #params you want to send

    response = requests.request("POST",url,headers=headers,data=data)  #you can choose your methods here.
    return response.text.encode('utf-8')

БЮР просто так.

...