A partir de ce moment, ce sera l'édition Web API. Jusqu'à présent, nous avons créé des applications Web en partant du principe que les gens les navigueront et les utiliseront avec un navigateur. Cependant, dans les temps modernes, l'utilisation d'applications autres que les navigateurs, telles que les applications pour smartphone, est devenue courante. En plus de l'application officielle, il est concevable que la fonction soit ouverte au public et utilisée par le programme. Dans un tel cas, l'API Web est l'interface entre l'application Web et le programme selon certaines règles, c'est-à-dire l'interface entre l'application Web et le programme. Il est également possible de créer une application Web à partir d'une application côté client à l'aide de l'API Web, même dans une application Web normale. Dans ce cas, la fonction côté serveur et la fonction côté client sont séparées et la visibilité du programme est améliorée.
Jusqu'à présent, le processus de retour du code HTML en réponse à une demande a été effectué. html est généralement conçu pour être affiché sur un navigateur et exploité par une personne. Par conséquent, il est possible d'utiliser html avec WebAPI, mais il est souvent gênant et inefficace de l'utiliser par programme. Par conséquent, de nombreuses API Web [^ 1] utilisent souvent un format appelé JSON (JavaScript Object Notation). Le format exact de JSON est défini dans la RFC 8259. Fondamentalement, vous pouvez comprendre les nombres et les chaînes en Python, les valeurs booléennes (vrai, faux), les listes pouvant contenir des valeurs nulles et les dictionnaires. Le style d'écriture est presque le même. Un exemple de json est illustré ci-dessous.
{
"id": 3,
"name": "hoge",
"ref": [1, 2, 4],
}
Dans cet exemple, l'id est la clé, la valeur numérique est 3, le nom est la chaîne de caractères hoge et le "ref" est le tableau [1, 2, 3].
Pour renvoyer le json avec le contenu ci-dessus à partir de Flask, procédez comme suit.
from flask import Flask, jsonify
app = Flask(__name__)
#Pouvoir utiliser le japonais
app.config['JSON_AS_ASCII'] = False
books = [{'name': 'EffectivePython', 'price': 3315}, {'name': 'Expert Python Programming', 'price': 3960}]
@app.route('/')
def get_json():
data = {
"id": 3,
"name": "hoge",
"ref": [1, 2, 4],
}
return jsonify(data)
if __name__ == '__main__':
app.run()
Tout d'abord
app.config['JSON_AS_ASCII'] = False
J'ai rendu possible l'utilisation du japonais en JSON (cette fois ce n'est pas grave, mais il vaut mieux l'inclure). Ensuite, créez l'objet à renvoyer.
data = {
"id": 3,
"name": "hoge",
"ref": [1, 2, 4],
}
Il utilise des dictionnaires et des listes Python.
Ensuite, ces données sont converties en json et renvoyées.
return jsonify(data)
Utilisez la fonction jsonify pour cela.
Pour résumer ce qui précède, vous pouvez exprimer JSON à l'aide d'un dictionnaire et d'une liste Python normaux, et le convertir en JSON à l'aide de la fonction jsonify.
Jusqu'à présent, je vérifiais et déboguais des pages Web à partir d'un navigateur. Cependant, lors du débogage de l'API Web, il est pratique de pouvoir déboguer à partir de PyCharm ou autre. Surtout pour POST, nous utilisions des formulaires, mais dans le cas de l'API Web, il est difficile de fonctionner depuis le navigateur car le POST se fait directement. PyCharm (version professionnelle) dispose d'une fonction (client HTTP) pour créer et envoyer des requêtes HTTP sur PyCharm. Je vais vous présenter sa fonction. Vous pouvez probablement le faire avec des IDE autres que PyCharm. Vous pouvez également utiliser un outil appelé cURL. Si vous utilisez autre chose que PyCharm, veuillez le vérifier.
Le client HTTP de PyCharm propose deux méthodes, l'une consiste à envoyer une requête HTTP ad hoc et l'autre à enregistrer la requête HTTP dans un fichier et à l'envoyer. Cette fois, je vais vous présenter comment enregistrer une requête HTTP réutilisable dans un fichier.
Tout d'abord, sélectionnez Nouveau dans le menu Fichier et cliquez sur Requête HTTP (voir la figure ci-dessous).
Ensuite, il vous sera demandé d'entrer le nom du fichier, alors entrez un nom approprié (ou get_test s'il est propre).
Puisque nous enverrons une demande GET cette fois, sélectionnez "GET Request" dans "Add Request" en haut à droite (voir la figure ci-dessous).
Cela insérera le modèle de demande GET. Réécrivez le modèle inséré comme suit en fonction de cette heure.
GET http://localhost:5000/
Accept: application/json
###
La signification de ceci est d'abord
GET http://localhost:5000/
Indique qu'une demande GET sera envoyée à "http: // localhost: 5000 /".
Accept: application/json
Indique que le type de contenu à envoyer est "application / json" (puisqu'il s'agit d'une phrase fixe, vous ne devez pas trop vous inquiéter).
###
Affiche le délimiteur de requête lors de l'écriture de plusieurs requêtes HTTP dans la notation spécifique au client HTTP de PyCharm. Il y a beaucoup d'autres choses que je peux écrire, mais c'est le minimum. D'autres fonctions suivent essentiellement la syntaxe de l'en-tête HTTP. Je veux que vous vérifiiez chacun d'eux.
Ensuite, envoyons réellement cette demande. Tout d'abord, exécutez l'exemple de programme. Après cela, vous pouvez envoyer la demande en retournant à HTTPClient et en cliquant sur le vert ▶ (illustré ci-dessous) à gauche de GET dans l'éditeur.
Ensuite, le résultat de l'exécution sera affiché ci-dessous.
Jusqu'à présent, le processus de renvoi de JSON à la requête GET a été effectué. Ensuite, je présenterai le processus de réception d'une requête POST et le json qu'il contient.
Le programme principal (app.py) est le suivant.
from flask import Flask, request, jsonify
app = Flask(__name__)
#Pouvoir utiliser le japonais
app.config['JSON_AS_ASCII'] = False
books = [{'name': 'EffectivePython', 'price': 3315}, {'name': 'Expert Python Programming', 'price': 3960}]
@app.route('/books', methods=['POST'])
def post_json():
#Recevoir JSON
json = request.get_json()
#Analyser JSON
name = json['name']
price = json['price']
book = {'name': name, 'price': price}
book_id = len(books)
books.append(book)
#Construire un dictionnaire de retour
book['id'] = book_id
return jsonify(book) #Réponse JSON
@app.route('/books/<book_id>', methods=['GET'])
def get_json_from_dictionary(book_id):
return jsonify(books[int(book_id)])
if __name__ == '__main__':
app.run()
Un exemple de demande est ci-dessous.
POST http://localhost:5000/books
Content-Type: application/json
{
"name": "hoge",
"price": 1000
}
###
GET http://localhost:5000/books/2
Content-Type: application/json
###
Après avoir reçu la demande POST, vous pouvez convertir JSON en objet Python en utilisant get_json comme indiqué ci-dessous.
request.get_json()
L'objet converti par get_json peut être traité comme un dictionnaire ou une liste Python (la partie ci-dessous).
#Analyser JSON
name = json['name']
price = json['price']
De plus, vous pouvez définir des URL qui ont le même nom mais qui ont des méthodes HTTP différentes (GET et POST ici), qui n'ont pas été expliquées jusqu'à présent. Les API Web (en particulier celles appelées API REST) le font souvent. Cela indique clairement que vous l'obtiendrez dans le cas de GET et que vous l'enverrez dans le cas de POST.
Dans le problème de la partie 1, chapitre 5, nous avons examiné le système de gestion des stocks pour les produits. Je souhaite implémenter cette fonction en tant qu'API Web. Implémentez une API Web pour ajouter / supprimer / acquérir des produits. Utilisez DB. Cette fois, à cause des indications, il y a presque la même partie que le problème dans la partie 1, chapitre 5. Vous pouvez détourner la réponse.
-Créer un tableau avec (ID produit, nom du produit, prix) comme colonne
--Créez une API de modification de produit (/ api / 1.0 / items / id). Puisqu'il s'agit d'une mise à jour, utilisez la méthode PUT. --Créez une page de suppression de produit (/ api / 1.0 / items / id). Puisqu'il s'agit d'une suppression, utilisez la méthode DELETE.
[^ 1]: "Beaucoup", pas tous. Dans le passé, un format appelé XML, qui est proche du html, était utilisé. Récemment, un protocole appelé gRPC qui permet une communication plus rapide est également apparu.
Recommended Posts