【问题标题】:why am I getting "Failed to decode JSON object: No JSON object could be decoded" error?为什么会出现“无法解码 JSON 对象:无法解码 JSON 对象”错误?
【发布时间】:2018-08-14 13:35:09
【问题描述】:

我在下面写了这段代码:

@url_api.route("/add")
class AddIPvFour(Resource):
    """ this class contains functions to add new url.
    """

    def post(self):
        """
            Add a new URL map to IP or update exisitng.

        :return: json response object status of newly added ip to url mapped
            or updated exisintg ip to url map.
        """
        apiAuth = None
        data = request.get_json(force=True)

        if not data:
            return jsonify({"status": "no data passed"})

        if not data["ip"]:
            return jsonify({"status" : "please pass the new ip you want to update"})
        # becuase if user has registered his API key must exist.
        if not data["apikey"]:
            return jsonify({"status": "missing API KEY"})

        apiAuth = models.APIAuth.get_apiauth_object_by_key(data["apikey"])

        if not apiAuth:
            return jsonify({"status": "invalid api key"})

        # if user exists get table name
        user_table_name = helpers.get_table_name(apiAuth.email)
        if not helpers.table_exists(user_table_name):
            user_table = helpers.create_user_table(user_table_name)
        else:
            user_table = helpers.get_user_table(user_table_name)

        # if same ip exists external port address should not exist in mapped in db.
        query_table = helpers.get_query_result(user_table_name, "ipaddress", data['ip']).fetchall()
        ports_mapped_to_ip_in_db = [item[5] for item in query_table]
        if int(data['port']) in ports_mapped_to_ip_in_db:
            return jsonify({"status": "{}:{} is already registered.".format(data["ip"], data["port"])})



        device = ""
        service = ""
        path = ""
        ipaddress = data["ip"]

        if "port" in data:
            port = data["port"]
        else:
            port = 80
        if "device" in data:
            device = data["device"]
        if "service" in data:
            service = data["service"]
        if "path" in data:
            path = data["path"]

        date_modified = datetime.now(tz=pytz.timezone('UTC'))

        urlmap = str(uuid.uuid4().get_hex().upper()[0:8])  

        field_values = {
        "ipaddress": ipaddress,
        "urlmap": urlmap,
        "port" : port,
        "device": device,
        "service": service,
        "date_created": date_modified,
        "date_modified" :date_modified,
        "path" : path,
        "count_updates": 1 if not hasattr(user_table, "count_updates") else  user_table.count_updates + 1
        }
        helpers.insert_to_table(user_table, field_values)
        result = helpers.get_query_result(user_table_name, "urlmap", urlmap)

        return jsonified(result.fetchone())

但是当我尝试获取时:

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' 'http://127.0.0.1:5000/api/add?API_KEY=cJRuOJyD2QdJpFpugf1QwrROKEuhSX80cRGLW6hoAC0&ip=127.0.0.1'

我尝试调试,但我认为我收到错误来自

data = request.get_json(force=True) 但为什么我要传递 JSON 格式! 但是,如果我使用 -d 标志传递数据。

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' 'http://127.0.0.1:5000/api/add' -d '{"API_KEY":"cJRuOJyD2QdJpFpugf1QwrROKEuhSX80cRGLW6hoAC0", "ip":"127.0.0.1", "port":"4260"}'

它有效。它也应该与 curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' 'http://127.0.0.1:5000/api/add?ip=127.0.0.2&API_KEY=cJRuOJyD2QdJpFpugf1QwrROKEuhSX80cRGLW6hoAC0' 来自终端或使用 http://127.0.0.1:5000/api/add?ip=127.0.0.2&API_KEY=cJRuOJyD2QdJpFpugf1QwrROKEuhSX80cRGLW6hoAC0 我最终得到了

{
    "message": "Failed to decode JSON object: No JSON object could be decoded"
}

【问题讨论】:

    标签: python json flask flask-restplus


    【解决方案1】:

    它也应该适用于

    curl -X POST --header 'Content-Type: application/json' \
     --header 'Accept: application/json' \
    'http://127.0.0.1:5000/api/add?ip=127.0.0.2API_KEY=cJRuOJyD2QdJpFpugf1QwrROKEuhSX80cRGLW6hoAC0'
    

    从终端

    您发送了一个header 声明您将发送一个application/json 对象——但是您没有发送这样的对象,因为数据在 URL 中(这本身并不常见因为您使用的是 POST 方法;因此,您通常以表单编码或 www-multipart 的形式发送信息。

    拥有force=True 允许调用工作,即使您发送 JSON,但不发送标头。它不会反过来工作(发送标头但不发送 JSON)。

    因此,错误消息对我来说似乎很合适。

    {
        "message": "Failed to decode JSON object: No JSON object could be decoded"
    }
    

    试试:

    curl -H 'Content-Type: application/json' \
         -H 'Accept: application/json' \
         -d '{"ip":"127.0.0.2", "API_KEY":"cJRuOJyD2QdJpFpugf1QwrROKEuhSX80cRGLW6hoAC0"}' \
         'http://127.0.0.1:5000/api/add'
    

    【讨论】:

      猜你喜欢
      • 2015-03-29
      • 2022-01-07
      • 2023-03-12
      • 2016-11-05
      • 2014-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多