为什么我得到“无法解码JSON对象:没有JSON对象可以被解码”错误?

问题描述 投票:-3回答:1

我在下面写了这段代码:

@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个回答
0
投票

它也应该合作

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方法本身并不常见;有了这个,你通常发送信息为form-encoded或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'
© www.soinside.com 2019 - 2024. All rights reserved.