flask_restful接口设计,postman测试

本文详细介绍了使用Flask-RESTful框架创建RESTful API的具体步骤,包括定义资源类、处理GET和PUT请求的方法,以及如何通过Python的requests库进行接口测试。特别强调了从form数据类型更改为json数据类型解决接口测试工具如Fiddler或Postman中出现的400错误问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最经典的就是看原版文档:

快速入门 — Flask-RESTful 0.3.1 documentation

其实蛮简单,照猫画虎就是

class RestInterface(Resource):
    def get(self,id):
        return {id: 'hello world'}
    def put(self,id):
        cardNo=request.json['cardNo']
        cardID=request.json['cardID']
        print("request data:",cardNo,cardID)
        
        deviceID=searchhome(id)
        if deviceID==None:
            return{"ack":"no such room id"}
        if (int(cardNo)>100)|(int(cardNo)<0):
            return {"ack":"cardNo error"}
        if (len(cardID)!=10):
            return {"ack":"wrong cardID"}
        try:
            addCard(deviceID[6:16],cardNo,cardID)
            return{"ack":"OK"}
        except Exception as e: 
            return {"ack":("error:  "+str(e)) }

api.add_resource(RestInterface, '/api/<string:id>')  # id is room number

测试程序设计:

HOST_DEFAULT="http://127.0.0.1:6001"# "http://203.195.224.224:6001"
from requests import put,get
import json

url=HOST_DEFAULT+"/api/5-2011"
body={"cardNo":10,"cardID":"0102030405","user":"testing","password":"testing"}
print("ready to connect:",url)
print("ready to send data: ",body)
r = put(url=url, data=body )
print("return value: ", r)
print("unformatingg: ",r.json())


测试程序通过后,发给了客户,但是用flidder或者postman一类的测试工具测试接口,总返回400错误,百思不得其解,

后面发现问题在于接口设计的这一句

cardNo=request.json['cardNo']开始用成了例子里的form,改为json后正确通过

<think>好的,用户遇到了使用Flask-RESTful返回字典时,页面没有自动设置中文编码的问题。我需要先理清可能的原因,然后一步步给出解决方案。 首先,用户提到返回的是字典,而Flask-RESTful默认会将其转换为JSON响应。但页面的编码可能不是UTF-8,导致中文字符显示乱码。这可能涉及到HTTP响应头的Content-Type设置是否正确,特别是charset参数。 接下来,我需要回忆Flask-RESTful的默认行为。默认情况下,Flask-RESTful的Content-Type是application/json,但可能没有指定charset=utf-8,导致浏览器无法正确解析中文。这时候需要检查响应头是否正确设置了编码。 然后,解决方案可能包括几个方面:一是确保Flask应用配置正确,比如设置JSON_AS_ASCII为False,这样JSON.dumps就不会将中文转义为ASCII。二是强制设置响应头的Content-Type为application/json; charset=utf-8,可以通过装饰器或者修改api的representation方法。三是检查客户端是否支持UTF-8编码,确保没有覆盖服务器的设置。 另外,用户可能没有明确说明是否使用了特定的配置或中间件,可能需要考虑其他可能性,比如中间件修改了响应头,或者浏览器缓存导致的问题。这时候建议用户检查响应头实际返回的内容,确认charset是否正确,或者尝试使用Postman等工具测试接口,排除浏览器缓存的影响。 最后,可能需要综合多个方法,确保配置正确、响应头正确设置,并且客户端正确处理编码。同时,提醒用户确保字典中的中文字符是Unicode字符串,避免在数据源处出现问题。</think>你遇到的问题是由于Flask-RESTful返回JSON时未正确设置中文字符编码导致的。可以通过以下步骤解决: 1. **根本原因分析**: - Flask-RESTful默认使用`application/json`的Content-Type - 未显式指定字符编码时,可能默认使用ASCII编码 - 中文字符在ASCII编码下会被转换为Unicode转义序列(如`\uXXXX`) 2. **解决方案**: ```python from flask import Flask, jsonify from flask_restful import Api, Resource app = Flask(__name__) app.config['JSON_AS_ASCII'] = False # 关键配置:禁用ASCII转义 api = Api(app) class MyResource(Resource): def get(self): return {'message': '你好,世界!'} api.add_resource(MyResource, '/') if __name__ == '__main__': app.run() ``` 3. **补充方案(如果问题未解决)**: ```python # 方法1:强制设置响应头 class MyResource(Resource): def get(self): return {'message': '你好'}, 200, {'Content-Type': 'application/json; charset=utf-8'} # 方法2:自定义JSON处理器 @api.representation('application/json') def output_json(data, code, headers=None): resp = jsonify(data) resp.headers.extend(headers or {}) resp.charset = 'utf-8' # 显式设置字符集 return resp ``` 4. **验证步骤**: - 使用浏览器开发者工具查看响应头应包含: $$Content-Type: application/json; charset=utf-8$$ - 原始响应内容应直接显示中文而非Unicode转义 5. **常见问题排查**: - 确保Python文件本身保存为UTF-8编码 - 检查系统区域设置(LANG环境变量) - 测试不同客户端(Postman/curl)排除浏览器缓存问题 如果仍然遇到问题,建议检查中间件配置或尝试使用Flask的`jsonify`直接返回响应: ```python from flask import jsonify class MyResource(Resource): def get(self): return jsonify({'message': '你好世界'}) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海里的鱼2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值