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

时间:2018-03-06 16:01:32

标签: python json flask flask-restplus

我在下面写了这段代码:

@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"
}

1 个答案:

答案 0 :(得分: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个对象 - 然而您不发送此类对象,因为数据位于网址中(由于您使用的是POST方法,这本身并不常见;因此,您通常会以form-encoded或www-multipart方式发送信息。

即使您发送了JSON,force=True允许调用工作,但不发送标头。它不会反过来(发送标题但没有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'