JSON API 規范的優勢

開發者經常會面臨 API 變更帶來的問題,比如依賴的庫不再支持某些方法,或者默認語義發生變化導致舊行為被隱藏。JSON API 的穩定性和可維護性。

此外,JSON API 規范詳細規定了從響應格式到端點行為的方方面面,包括集合與數組的選擇、缺失記錄的 HTTP 響應代碼等。這些規定幫助開發者避免重復造輪子,將更多精力集中在功能實現上。


實現 JSON API 的代碼示例

以下是一個基于 Grape 和 JSON API 的簡單實現示例:

# Gemfile
gem 'pg'
gem 'sequel-rails'
gem 'sequel_secure_password'
gem 'grape'
gem 'grape-jsonapi-resources'
gem 'jsonapi-resources'

# app/models/user.rb
class User < Sequel::Model
  plugin :secure_password  def validate
    super
    validates_presence [:email, :password_digest, :first_name, :last_name]
  end
end# app/controllers/api/base.rb
module API
  class Base < Grape::API
    mount API::V1::Base
  end
end# app/controllers/api/v1/base.rb
module API
  module V1
    class Base < Grape::API
      mount API::V1::Users
    end
  end
end

以上代碼通過嵌套命名空間實現了 API 的版本化,結構清晰且易于擴展。


設置默認響應格式

在 Grape 中,可以通過擴展 ActiveSupport::Concern 來設置默認的響應格式:

# app/controllers/concerns/api/v1/defaults.rb
module API
  module V1
    module Defaults
      extend ActiveSupport::Concern

      included do
        version 'v1', using: :path
        format :json
        formatter :json, Grape::Formatter::JSONAPIResources
        content_type :json, 'application/vnd.api+json'        rescue_from Sequel::NoMatchingRow do |exception|          params = env['api.endpoint'].params
          record_not_found = JSONAPI::Exceptions::RecordNotFound.new(params[:id])
          not_found = JSONAPI::ErrorsOperationResult.new(record_not_found.errors[0].code, record_not_found.errors)
          error! not_found, 404
        end
      end
    end
  end
end

上述代碼中,included 方法設置了 API 的版本、響應格式以及內容類型。此外,針對 Sequel 在處理不存在記錄時返回 nil 的行為,我們通過捕獲 Sequel::NoMatchingRow 異常并返回 404 錯誤來符合 JSON API 的規范。


定義端點

以下是用戶相關的端點定義,包括 GET 和 POST 請求:

# app/controllers/api/v1/users.rb
module API
  module V1
    class Users < Grape::API
      include API::V1::Defaults

      resource :users do
        desc '返回所有用戶'
        get do
          users = User.all
          render users
        end        desc '返回指定用戶'
        params do
          requires :id, type: Integer, desc: '用戶 ID'
        end
        route_param :id do
          get do
            user = User.with_pk!(params[:id])
            render user
          end
        end        desc '創建用戶'
        params do
          requires :email, type: String, desc: '新用戶郵箱'
          requires :first_name, type: String, desc: '新用戶名'
          requires :last_name, type: String, desc: '新用戶姓'
          requires :password, type: String, desc: '新用戶密碼'
          optional :password_confirmation, type: String, desc: '密碼確認'
        end
        post do
          user = User.new(
            email: params[:email],
            first_name: params[:first_name],
            last_name: params[:last_name],
            password: params[:password],
            password_confirmation: params[:password_confirmation]
          )
          user.save
        end
      end
    end
  end
end

通過上述代碼,我們定義了用戶的基本操作,包括獲取所有用戶、獲取指定用戶以及創建新用戶。


配置路由

最后,在 routes.rb 文件中掛載 API:

# config/routes.rb
mount API::Base => '/api'

完成配置后,您可以通過 /api/v1/users/:id 訪問用戶端點,并獲得符合 JSON API 規范的響應。


總結

通過 Grape 和 JSON API 的結合,您可以以較低的成本構建符合規范的 API。JSON API 的標準化設計不僅提升了開發效率,還減少了因規范不一致帶來的問題。通過本文的示例代碼,您可以快速上手并實現自己的 API 項目。

原文鏈接: https://www.hark.bz/blog/post/make-graperails-app-json-api-compliant-cheap-2/
熱門推薦
一個賬號試用1000+ API
助力AI無縫鏈接物理世界 · 無需多次注冊
3000+提示詞助力AI大模型
和專業工程師共享工作效率翻倍的秘密
熱門推薦
一個賬號試用1000+ API
助力AI無縫鏈接物理世界 · 無需多次注冊
返回頂部
上一篇
使用Python創建自己的API:初學者指南 - Medium
下一篇
使用Python創建API的三種方法 - Twilio
国内精品久久久久影院日本,日本中文字幕视频,99久久精品99999久久,又粗又大又黄又硬又爽毛片
首页亚洲欧美制服丝腿| 日本色综合中文字幕| 欧美激情在线免费观看| 狠狠色狠狠色合久久伊人| 欧美不卡一区二区| 九九九久久久精品| 久久久久久综合| 99r国产精品| 日韩激情视频网站| 欧美一区二区大片| 国产精品1024| 亚洲乱码国产乱码精品精可以看| 色婷婷综合久久久| 日本欧美加勒比视频| 国产亚洲欧美激情| 欧洲一区二区三区在线| 美女网站色91| 亚洲男女一区二区三区| 欧美一级在线观看| 99久久精品国产导航| 青娱乐精品视频在线| 日本一区免费视频| 欧美视频在线不卡| 国产a视频精品免费观看| 一区二区在线观看免费视频播放| 在线成人av网站| 99re66热这里只有精品3直播 | 天天综合网 天天综合色| 26uuu色噜噜精品一区二区| 91在线porny国产在线看| 美国毛片一区二区三区| 亚洲欧美视频一区| 久久久久久9999| 日韩免费观看高清完整版| 色国产精品一区在线观看| 国产乱码精品一区二区三区av| 一区二区三区免费| 国产精品久久午夜夜伦鲁鲁| 精品毛片乱码1区2区3区| 欧美色图12p| 91香蕉视频污在线| 国产福利精品一区二区| 久久99国产精品久久99果冻传媒| 亚洲精品日韩专区silk| 日本一区二区电影| 国产亚洲一区字幕| 精品国产一区a| 日韩欧美你懂的| 日韩欧美一级特黄在线播放| 欧美日韩高清一区| 欧美一区二区在线观看| 欧美一区二区三区播放老司机 | 在线看不卡av| 欧美色偷偷大香| 欧美日韩成人高清| 91精品国产色综合久久不卡电影| 欧美性大战久久久久久久| 91视频xxxx| 欧美无乱码久久久免费午夜一区| 欧美午夜精品电影| 欧美日韩激情一区二区三区| 欧美日韩的一区二区| 欧美一区二区大片| 久久久国产午夜精品| 国产欧美日韩一区二区三区在线观看| 国产三级精品视频| 国产精品久久久久久久久图文区 | 日韩一区二区在线看| 欧美mv日韩mv国产网站app| 久久久久久久久蜜桃| 国产精品午夜在线观看| 亚洲免费在线电影| 奇米精品一区二区三区在线观看 | 欧美色国产精品| 久久免费看少妇高潮| 自拍av一区二区三区| 亚洲综合色婷婷| 麻豆91在线播放| 色综合久久天天| 久久嫩草精品久久久精品| 亚洲欧美日韩久久| 久久av资源站| 欧美日韩一区二区电影| 国产午夜精品在线观看| 性欧美疯狂xxxxbbbb| 国产成人丝袜美腿| 欧美男人的天堂一二区| 国产精品视频一区二区三区不卡| 一区二区三区资源| 国产一区二区三区黄视频 | 欧美一级艳片视频免费观看| 亚洲国产成人在线| 午夜精品爽啪视频| www.欧美精品一二区| 精品国产91九色蝌蚪| 亚洲国产另类av| 91麻豆国产精品久久| 久久久精品蜜桃| 美女脱光内衣内裤视频久久网站| 色婷婷av一区二区三区之一色屋| 久久精品亚洲国产奇米99| 麻豆精品视频在线| 欧美不卡在线视频| 老司机精品视频导航| 56国语精品自产拍在线观看| 亚洲一区免费观看| 在线观看亚洲精品视频| 亚洲蜜臀av乱码久久精品蜜桃| gogo大胆日本视频一区| 国产欧美1区2区3区| 国产成人精品免费视频网站| 久久女同精品一区二区| 国产在线观看免费一区| 久久久91精品国产一区二区精品| 久久超碰97中文字幕| 欧美成人免费网站| 国产盗摄女厕一区二区三区| 国产亚洲污的网站| 91社区在线播放| 亚洲午夜激情av| 欧美成人vps| 成人久久视频在线观看| 日韩理论片在线| 666欧美在线视频| 国产精品一区在线| 一区二区三区四区蜜桃 | 国产精品综合网| 亚洲人亚洲人成电影网站色| 色香蕉久久蜜桃| 视频在线观看国产精品| 国产女主播在线一区二区| 欧美亚洲自拍偷拍| 国产又黄又大久久| 一区二区三区色| 久久久三级国产网站| 9l国产精品久久久久麻豆| 亚洲超碰精品一区二区| 国产日韩欧美综合在线| 在线视频中文字幕一区二区| 亚洲综合在线电影| 久久人人超碰精品| 欧美日韩国产高清一区二区三区| 国产一区二区在线看| 亚洲精品久久久蜜桃| 精品国产麻豆免费人成网站| 一本色道**综合亚洲精品蜜桃冫| 奇米影视一区二区三区小说| 日韩伦理免费电影| 国产香蕉久久精品综合网| 欧美男女性生活在线直播观看| eeuss鲁片一区二区三区 | 欧美久久婷婷综合色| 成人中文字幕合集| 捆绑调教一区二区三区| 夜夜揉揉日日人人青青一国产精品| 亚洲精品在线电影| 欧美日韩卡一卡二| 91成人在线精品| 99精品热视频| 成人禁用看黄a在线| 国产精品一品视频| 蜜臀va亚洲va欧美va天堂| 一区二区三区91| 综合色天天鬼久久鬼色| 中文字幕欧美区| 国产精品美女久久久久av爽李琼| 精品国产sm最大网站| 精品欧美黑人一区二区三区| 欧美一区二区精美| 日韩视频不卡中文| 日韩欧美一级二级| 精品久久久久久久一区二区蜜臀| 欧美日韩在线不卡| 在线精品视频免费观看| 在线观看视频一区二区欧美日韩| 色婷婷久久久综合中文字幕| 在线视频你懂得一区| 欧美日韩精品久久久| 国产激情一区二区三区桃花岛亚洲| 91精品国产综合久久香蕉麻豆| 色网站国产精品| 91福利视频网站| 欧美日韩国产高清一区二区三区 | 欧美videos中文字幕| 日韩美女天天操| 久久久久亚洲综合| 中文字幕免费一区| 亚洲伦理在线免费看| 一区二区三区视频在线观看| 一区二区三区电影在线播| 亚洲精品中文字幕乱码三区| 亚洲电影一区二区| 久久99精品一区二区三区| 国产在线播精品第三| 大陆成人av片| 欧美日韩一区不卡| 久久久久久久国产精品影院| 亚洲精品免费播放| 韩国成人在线视频| 欧美午夜在线观看|