Как сделать простой Python REST сервер и клиент? - PullRequest
1 голос
/ 05 марта 2020

Я пытаюсь сделать максимально простой сервер и клиент REST API, и сервер и клиент будут написаны на Python и запущены на одном компьютере.

Из этого руководства:

https://blog.miguelgrinberg.com/post/designing-a-restful-api-with-python-and-flask

Я использую это для сервера:

# server.py

from flask import Flask, jsonify

app = Flask(__name__)

tasks = [
    {
        'id': 1,
        'title': u'Buy groceries',
        'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
        'done': False
    },
    {
        'id': 2,
        'title': u'Learn Python',
        'description': u'Need to find a good Python tutorial on the web',
        'done': False
    }
]

@app.route('/todo/api/v1.0/tasks', methods=['GET'])
def get_tasks():
    return jsonify({'tasks': tasks})

if __name__ == '__main__':
    app.run(debug=True)

Если я запускаю это из командной строки:

curl -i http://localhost:5000/todo/api/v1.0/tasks

Я получаю это:

HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 317
Server: Werkzeug/0.16.0 Python/3.6.9
Date: Thu, 05 Mar 2020 02:45:59 GMT

{
  "tasks": [
    {
      "description": "Milk, Cheese, Pizza, Fruit, Tylenol", 
      "done": false, 
      "id": 1, 
      "title": "Buy groceries"
    }, 
    {
      "description": "Need to find a good Python tutorial on the web", 
      "done": false, 
      "id": 2, 
      "title": "Learn Python"
    }
  ]
}

Отлично, теперь мой вопрос: как мне написать скрипт Python, использующий запросы для получения той же информации?

Я подозреваю это это правильная идея:

# client.py

import requests

url = 'http://todo/api/v1.0/tasks'

response = requests.get(url,
                        # what goes here ??
                        )

print('response = ' + str(response))

Однако, как вы можете видеть из моего комментария, я не уверен, как настроить параметры для requests.get.

Я пытался использовать это Сообщение SO:

Выполнение запроса к API RESTful с использованием python

в качестве руководства, однако неясно, как настроить форматирование для изменения сообщения.

Может предоставить краткое описание того, как настроить параметры для передачи в requests.get и предложить необходимые изменения для получения приведенный выше пример работает? Спасибо!

--- Edit ---

Еще кое-что, что я могу упомянуть, это то, что я довольно легко заставил клиента работать с Postman, я просто не уверен, как настроить синтаксис в Python:

enter image description here

--- Edit ---

На основании приведенного ниже ответа icedwater, это завершено, рабочий код для клиента:

# client.py

import requests
import json

url = 'http://localhost:5000/todo/api/v1.0/tasks'

response = requests.get(url)

print(str(response))
print('')
print(json.dumps(response.json(), indent=4))

результат:

<Response [200]>

{
    "tasks": [
        {
            "description": "Milk, Cheese, Pizza, Fruit, Tylenol",
            "done": false,
            "id": 1,
            "title": "Buy groceries"
        },
        {
            "description": "Need to find a good Python tutorial on the web",
            "done": false,
            "id": 2,
            "title": "Learn Python"
        }
    ]
}

1 Ответ

1 голос
/ 05 марта 2020

С help(requests.get):

Help on function get in module requests.api:

get(url, params=None, **kwargs)
    Sends a GET request.

    :param url: URL for the new :class:`Request` object.
    :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    :return: :class:`Response <Response>` object
    :rtype: requests.Response

, поэтому я бы сказал, что requests.get(url) будет достаточно, чтобы получить ответ. Затем посмотрите на функции json() или data() в response в зависимости от того, что API должен возвращать.

Так что в случае ответа JSON следующего кода должно быть достаточно :

import requests
import json

url = "https://postman-echo.com/get?testprop=testval"
response = requests.get(url)
print(json.dumps(response.json(), indent=4))

Попробуйте приведенный выше код с реальным тестовым API.

...