Я много с этим борюсь. Прошел просмотр документации по requests
API, но не смог выполнить ее идеально.
Я написал скрипт на python, предназначенный для получения GET
, POST',and the remaining REST operations through a command line.
GET works fine, and any request from the
localhost` url.
Однако я не могу POST
новые данные. Например, метод GET
выдается так:
request.py -r get -f 1 -u http://127.0.0.1:5002/user
и данные userID 1 отображаются в формате JSON. user
- это имя базы данных, которая содержит эти операции.
Точно так же я хотел бы post
новые данные в JSON
формате
Я попробовал эту команду, но получаю сообщение об ошибке
request.py -r get -f 7 -u http://127.0.0.1:5002/user {'user':'abc','email':xyz@abc.com}
getAddrInfoFailed
![enter image description here](https://i.stack.imgur.com/8e1qP.png)
Ниже приведен код для создания базы данных, а также запросы
from flask import Flask, request
from flask_restful import Resource, Api
import sqlite3
import re
app = Flask(__name__)
api = Api(app)
def validate_email(email):
match = re.search('^[_A-Za-z0-9-]+(\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*(\.[A-Za-z]{2,4})$', email)
if match:
return True
else:
return False
def validate_username(username):
match = re.search('^[A-Za-z0-9_-]{3,20}$', username)
if match:
return True
else:
return False
def validate_id(id):
if id.isdigit():
return True
else:
return False
class Users(Resource):
def get(self, id):
try:
conn = sqlite3.connect('curd.db')
cursor = conn.cursor()
if validate_id(id):
query = cursor.execute("SELECT * FROM user WHERE id=?", [int(id), ])
row = query.fetchone()
if row:
return {'item': {'id': row[0], 'username': row[1], 'email': row[2]}},200
else:
return {'MESSAGE': 'USER NOT FOUND'}, 404
else:
return {'MESSAGE': 'INVALID INPUT'}, 400
except:
conn.rollback()
finally:
conn.commit()
conn.close()
def post(self, id):
try:
conn = sqlite3.connect('curd.db')
cursor = conn.cursor()
usr = request.get_json()
username = usr['username']
email = usr['email']
if validate_id(id) is True and validate_username(username)is True and validate_email(email) is True:
query = cursor.execute("SELECT * FROM user WHERE id=?", [int(id), ])
row = query.fetchone()
if row:
return {'MESSAGE': 'USER ID ALREADY EXISTS'}, 400
else:
cursor.execute("INSERT INTO user(id, username, email) VALUES(?,?,?)", [id, username, email])
return {'response': 'Success'},201
else:
return {'MESSAGE': 'INVALID INPUT'}, 400
except:
conn.rollback()
finally:
conn.commit()
conn.close()
def put(self, id):
try:
conn = sqlite3.connect('curd.db')
cursor = conn.cursor()
usr = request.get_json()
updated_name = usr['username']
updated_email = usr['email']
if validate_id(id) and validate_username(updated_name) and validate_email(updated_email):
query = cursor.execute("SELECT * FROM user WHERE id=?", [int(id), ])
row = query.fetchone()
if row:
cursor.execute("UPDATE user SET username = '" + str(updated_name) + "',email = '" + str(updated_email) + "' WHERE id = %d" % int(id))
return {'response': 'Success'},200
else:
return {'MESSAGE': 'USER NOT FOUND'}, 404
else:
return {'MESSAGE': 'INVALID INPUT'}, 400
except:
conn.rollback()
finally:
conn.commit()
conn.close()
def delete(self, id):
try:
conn = sqlite3.connect('curd.db')
cursor = conn.cursor()
if validate_id(id):
query = cursor.execute("SELECT * FROM user WHERE id=?", [id, ])
row = query.fetchone()
if row:
conn.execute("DELETE FROM user WHERE id = %d" % int(id))
return {'response': 'Success'},200
else:
return {'MESSAGE': 'USER NOT FOUND'}, 404
else:
return {'MESSAGE': 'INVALID INPUT'}, 400
except:
conn.rollback()
finally:
conn.commit()
conn.close()
api.add_resource(Users,'/user/<string:id>',methods=['GET','POST','PUT','DELETE'])
if __name__ == '__main__':
app.run(port=5002, debug=True)
requests.py
import requests
import json
import sys
from optparse import OptionParser, make_option
if len(sys.argv) <= 1:
print('Need at least 1 argument.')
print("Add -h for Help")
sys.exit(1)
parser = OptionParser()
parser.add_option('-r', '--request', help="Request Type['GET','POST','PUT','DELETE']",default="")
parser.add_option('-f', '--id', help='id')
parser.add_option('-u', '--url', help="URL String",default="")
(options, args) = parser.parse_args()
print("ID = "+options.id)
print("Request Type = "+options.request)
print("Request URL = "+options.url)
url = options.url+"/"+options.id
data = ''
payload= {'key1':'value1','key2':'value2'}
if options.request == "get":
response = requests.get(url, data=data)
elif options.request=="post":
response = requests.post(url, params=payload)
else:
print("Invalid Request..!!")
print(response.text)