第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關(guān)于restfull api 接口問題。

關(guān)于restfull api 接口問題。

溫溫醬 2019-02-21 07:14:33
class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(64), unique=True, index=True) username = db.Column(db.String(64), unique=True, index=True) role_id = db.Column(db.Integer, db.ForeignKey('roles.id')) password_hash = db.Column(db.String(128)) confirmed = db.Column(db.Boolean, default=False) name = db.Column(db.String(64)) location = db.Column(db.String(64)) about_me = db.Column(db.Text()) member_since = db.Column(db.DateTime(), default=datetime.utcnow) last_seen = db.Column(db.DateTime(), default=datetime.utcnow) avatar_hash = db.Column(db.String(32)) posts = db.relationship('Post', backref='author', lazy='dynamic') comments = db.relationship('Comment', backref='author', lazy='dynamic') def to_json(self): json_user = { 'url': url_for('api.get_post', id=self.id, _external=True), 'username': self.username, 'member_since': self.member_since, 'last_seen': self.last_seen, 'posts': url_for('api.get_user_posts', id=self.id, _external=True), 'post_count': self.posts.count() } return json_user class Post(db.Model): __tablename__ = 'posts' id = db.Column(db.Integer, primary_key=True) body = db.Column(db.Text) body_html = db.Column(db.Text) timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow) author_id = db.Column(db.Integer, db.ForeignKey('users.id')) comments = db.relationship('Comment', backref='post', lazy='dynamic') def to_json(self): json_post = { 'url': url_for('api.get_post', id=self.id, _external=True), 'body': self.body, 'body_html': self.body_html, 'timestamp': self.timestamp, 'author': url_for('api.get_user', id=self.author_id, _external=True), 'comments': url_for('api.get_post_comments', id=self.id, _external=True), 'comment_count': self.comments.count() } return json_post 2個類的定義如上,然后,假設(shè)現(xiàn)在需要獲取設(shè)計兩個接口: 獲取某個文章詳細(xì)信息的接口。 獲取某個人發(fā)表的文章詳細(xì)信息。 我看到很多教程都是類似這樣設(shè)計的: @api.route('/posts/<int:id>') def get_post(id): post = Post.query.get_or_404(id) return jsonify(post.to_json()) @api.route('/users/<int:id>/posts/') def get_user_posts(id): user = User.query.get_or_404(id) page = request.args.get('page', 1, type=int) pagination = user.posts.order_by(Post.timestamp.desc()).paginate( page, per_page=current_app.config['FLASKY_POSTS_PER_PAGE'], error_out=False) posts = pagination.items prev = None if pagination.has_prev: prev = url_for('api.get_posts', page=page-1, _external=True) next = None if pagination.has_next: next = url_for('api.get_posts', page=page+1, _external=True) return jsonify({ 'posts': [post.to_json() for post in posts], 'prev': prev, 'next': next, 'count': pagination.total }) 對于接口返回的數(shù)據(jù)我有幾個疑問: 1:為什么很多詳細(xì)信息都是返回URL而不是實體。 比如:Class User類的to_json()方法為什么不像這樣設(shè)計? def to_json(self): json_user = { 'url': url_for('api.get_post', id=self.id, _external=True), 'username': self.username, 'member_since': self.member_since, 'last_seen': self.last_seen, 'posts': [post.to_json() for post in self.posts], 'post_count': self.posts.count() } return json_user 2:如果要返回實體信息要怎么操作好? 3:我在github中看到很多flsk開源的項目,里面序列化或者反序列化都是用類似上面to_json, to_dict實現(xiàn)的,包括很多教程都是這樣設(shè)計的。這種方法,個人覺得對于Model有幾十個屬性就感覺很無力,有什么好的辦法?
查看完整描述

1 回答

?
一只甜甜圈

TA貢獻(xiàn)1836條經(jīng)驗 獲得超5個贊

按照自己對Restful的理解,接口是針對資源進(jìn)行操作。github曾經(jīng)設(shè)計API接口是針對單獨的資源,而獲取每個資源的接口,里面提供一些url,以便可以獲取下一個,或者返回上一個資源。

1:為什么很多詳細(xì)信息都是返回URL而不是實體。

設(shè)計兩個接口,一個針對user這個資源獲取詳細(xì)信息,另外一個針對post這個資源獲取詳細(xì)信息。
其中在獲取用戶發(fā)布文章的詳細(xì)信息的接口。涉及userpost兩個資源。根據(jù)查詢條件是先找到user,再通過user去找post。因此可以看成是獲取user這個資源,而user里涵蓋了post資源,因此post字段換成獲取post詳細(xì)信息的接口,以便邏輯繼續(xù)進(jìn)行。

可以理解為一個資源就是一個表,一個接口只請求這個表的字段,至于外鍵字段的實體資源,則提供查詢的url接口。拋開那些實體之間的join操作。

比如:Class User類的to_json()方法為什么不像這樣設(shè)計?

看原來的設(shè)計,是獲取user下某篇post的詳細(xì)信息,關(guān)聯(lián)了post_id,你改的那個是獲取user的發(fā)布的post列表。

2:如果要返回實體信息要怎么操作好?

直接查詢實體返回即可。

3 個人覺得對于Model有幾十個屬性就感覺很無力,有什么好的辦法?
沒看懂

其實盡管restful的提出了很久,也有所謂很多實踐。不同的人理解不一樣,也沒有比較統(tǒng)一的說法。githubapi是一個比較好的例子。

實際開發(fā)中,幾乎是不可能設(shè)計這樣針對單個資源,資源之間通過url獲取的接口的。因為先階段來說,客戶端工程師都希望一個接口搞定所有需要的數(shù)據(jù),才不會管你什么資源啊,實體啊。通常喜歡減少網(wǎng)絡(luò)的請求,哪怕傳輸?shù)臄?shù)據(jù)變多。

如果是自己想實現(xiàn)restful風(fēng)格的程序,可以參考githubapi。在工作中,估計沒有人會讓你這么做,客戶端要求什么,就寫什么,不需要糾結(jié)。

查看完整回答
反對 回復(fù) 2019-03-01
  • 1 回答
  • 0 關(guān)注
  • 1048 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號