我在下面写了这段代码:
@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"
}
答案 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'