-2

I have written this code below:

@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())

but when I try to fetch :

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'

I tried to debug and I think I get error from

data = request.get_json(force=True) but why I am passing JSON format ! however if I pass data using -d flag.

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

it works. it should also work with 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' from terminal or using http://127.0.0.1:5000/api/add?ip=127.0.0.2&API_KEY=cJRuOJyD2QdJpFpugf1QwrROKEuhSX80cRGLW6hoAC0 and I endup with

{
    "message": "Failed to decode JSON object: No JSON object could be decoded"
}
davidism
  • 98,508
  • 22
  • 317
  • 288
Ciasto piekarz
  • 6,378
  • 11
  • 59
  • 149

1 Answers1

0

it should also work with

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'

from terminal

You send a header stating that you're going to send an application/json object -- and yet you send no such object since the data is in the URL (which is itself uncommon since you're using POST method; with that, you usually send the info as form-encoded or www-multipart).

Having force=True allows the call to work even if you send the JSON, but don't send the header. It won't work the other way round (sending the header but no JSON).

The error message seems therefore appropriate to me.

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

Try:

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'
LSerni
  • 49,775
  • 9
  • 56
  • 97