到目前为止,已经执行了将html返回请求的过程。HTML通常被设计为在浏览器上显示并由人类操纵。因此,HTML可以与WebAPI一起使用,但是在程序中使用它通常很麻烦且效率低下。因此,许多1是的WebAPI JSON(JavaScript对象符号)被很好地利用的格式。JSON的确切格式在RFC 8259中定义。基本上,将Python理解为数值和字符串,布尔值(真,假),可以包含null的列表以及字典是很好的。写作风格几乎相同。以下是json的示例。
{
“ id”:3,
“ name”:“ hoge”,
“ ref”:[1、2、4],
}
在此示例中,将数组[1、2、3]分配给数值3,使用id作为键,使用字符串hoge,并使用“ ref”作为名称。
要从Flask返回上述json,请执行以下操作。
from flask import Flask, jsonify
app = Flask(__name__)
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()
综上,可以使用普通的Python字典和列表来表示JSON,然后使用jsonify函数将其转换为JSON。
到目前为止,我从浏览器检查了网页并进行了调试。但是,在调试WebAPI时,可以从PyCharm进行调试更加方便。到目前为止,尤其是对于POST,已经使用了表单,但是WebAPI很难通过浏览器进行操作,因为POST是直接执行的。PyCharm(专业版)具有一个功能(HTTP客户端),可在PyCharm上创建并发送HTTP请求。功能介绍。除PyCharm之外的其他IDE可能会这样做。另一种选择是使用称为cURL的工具。如果您使用的不是PyCharm,请检查一下。
PyCharm的HTTP客户端提供两种方法:一种用于发送临时HTTP请求,另一种用于将HTTP请求保存到文件并发送。在本文中,我将向您展示如何将可重用的HTTP请求保存到文件中。
首先,从文件菜单中选择“新建”,然后单击“ HTTP请求”(见下文)。
然后将要求您输入文件名,因此输入适当的名称(或使用get_test)。
由于这次发送了GET请求,因此请从右上方的“ Add Request”中选择“ GET Request”(请参见下图)。
使用PyCharm的HTTPClient独有的符号编写多个HTTP请求时,显示请求分隔符。您可以写很多,但这是最低要求。其他功能基本上遵循HTTP标头的语法。我要你调查。
接下来,让我们实际发送此请求。首先,执行示例程序。之后,您可以通过返回到HTTPClient并在编辑器中单击GET左侧的绿色▶(下方)来发送请求。
至此,前面已经完成了响应GET请求发送回JSON的过程。接下来,我将介绍接收POST请求和其中包含的json的过程。
主程序(app.py)如下。
from flask import Flask, request, jsonify
app = Flask(__name__)
# 日本語を使えるように
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():
# JSONを受け取る
json = request.get_json()
# JSONをパースする
name = json['name']
price = json['price']
book = {'name': name, 'price': price}
book_id = len(books)
books.append(book)
# 返却用ディクショナリを構築
book['id'] = book_id
return jsonify(book) # JSONをレスポンス
@app.route('/books/' , methods=['GET'])
def get_json_from_dictionary(book_id):
return jsonify(books[int(book_id)])
if __name__ == '__main__':
app.run()
一个示例请求如下。
POST http://localhost:5000/books
Content-Type: application/json
{
"name": "hoge",
"price": 1000
}
###
GET http://localhost:5000/books/2
Content-Type: application/json
###
收到POST请求后,您可以使用get_json将JSON转换为Python对象,如下所示。
request.get_json()
由get_json转换的对象可以像Python字典和列表一样进行处理(请参见下文)。
name = json['name']
price = json['price']
此外,您可以使用迄今尚未解释的相同名称定义URL,但使用不同的HTTP方法(此处为GET和POST)。WebAPI(尤其是那些称为REST API的API)通常会这样做。这具有在GET的情况下显式获取并在POST的情况下进行传输的含义。