代码之家  ›  专栏  ›  技术社区  ›  Jakob

烧瓶REST-API:响应中的数值错误

  •  0
  • Jakob  · 技术社区  · 9 月前

    我正在为我的REST-API使用flask-restx。在那里,我注意到一个奇怪的行为,一个大的整数值似乎返回错误。

    我使用这个最小的代码片段来重现这个问题:

    from flask_restx import Resource, Namespace
    
    ns = Namespace('resources')
    
    @ns.route('/<id_>')
    @ns.doc(params={"id_": "ID of a resource"})
    class ResourceItem(Resource):
    
    @staticmethod
    @ns.doc(responses={200: "Success", 404: "Not found"})
    def get(id_):
        return 6195659448464973308, 200
    

    响应正文中的预期内容将是(显然) 6195659448464973308 但实际的反应是 6195659448464973000 .

    如果响应是json格式,也会发生同样的情况:

    {"value": 6195659448464973308}
    

    我测试了几个大数字,但总是得到错误的答案。

    我在这里错过了什么或做错了什么?这个问题的解决方案看起来怎么样?

    1 回复  |  直到 9 月前
        1
  •  1
  •   Shai V.    9 月前

    这是因为javascript是如何处理的 large integers 。它使用IEEE 754,您尝试返回的数字超过了它的53位限制精度(即-9007199254740991)。 我想不出任何优雅的解决方案,比如将其作为字符串返回,然后在后端处理转换:

    您可以尝试以下操作:

    from flask_restx import Resource, Namespace
    
    ns = Namespace('resources')
    
    @ns.route('/<id_>')
    @ns.doc(params={"id_": "Some ID"})
    class ResourceItem(Resource):
    
        @staticmethod
        @ns.doc(responses={200: "Success", 404: "Not found"})
        def get(id_):
            # Here you can return the number as a string
            return {"value": str(6195659448464973308)}, 200