5

के साथ एपीआई संस्करण को कार्यान्वित करने का सही तरीका मुझे पता है कि पहले से ही कुछ प्रश्न हैं और this is a open issue regarding AMS not handling namespaces too efficiently (जो इस संस्करण दृष्टिकोण द्वारा उपयोग किया जाता है) लेकिन मैं यह सुनिश्चित करना चाहता था कि मैं वर्तमान बाधाओं के भीतर सही रास्ते में हूं।सक्रिय_model_serializers

# config/initializers/active_model_serializer.rb 
ActiveModelSerializers.config.serializer_lookup_enabled = false 

निष्क्रिय करने के लिए डिफ़ॉल्ट serializer देखने (जो वैसे भी काम नहीं किया);:

अभी मैं रेल 5 और एम्स 0.10.1 उपयोग कर रहा हूँ, इसलिए मैं निम्नलिखित किया और

# app/controllers/application_controller.rb 
class ApplicationController < ActionController::API 
    def get_serializer(resource, options = {}) 
    unless options[:each_serializer] || options[:serializer] then 
     serializer = (self.class.name.gsub("Controller","").singularize + "Serializer").constantize 
     resource.respond_to?(:to_ary) ? options[:each_serializer] = serializer : options[:serializer] = serializer 
    end 
    super(resource, options) 
    end 
end 

ओवरराइड करने के लिए डिफ़ॉल्ट रूप से serializers कैसे पाए जाते हैं; मेरी नियंत्रकों और serializer इस तरह हैं:

# app/controllers/api/v2/api_controller.rb 
module Api::V2 
    class ApiController < ApplicationController 
    ... 

# app/controllers/api/v2/users_controller.rb 
module Api::V2 
    class UsersController < ApiController 
    ... 

और

# app/serializers/api/v2/user_serializer.rb 
module Api::V2 
    class UserSerializer < ActiveModel::Serializer 
    ...  

अब, ActiveModel::Serializer.serializer_for(object) तरह बातें काम नहीं करेगा, तो मैं भी बंदर एपीआई संस्करण स्थापित करने के लिए example.metadata[:api_version] का उपयोग कर मेरे अनुरोध चश्मा पैच करने के लिए किया था प्रत्येक परीक्षण से पहले और बढ़ने और त्रुटि अगर उदाहरण ने इसे सेट नहीं किया है।

तो:

  1. वहाँ एक बेहतर तरीका दस्तावेज है?
  2. क्या यह सही होने के करीब है?
  3. क्या मुझे इस दृष्टिकोण के साथ समस्या का सामना करना पड़ेगा?
  4. इसे कैसे सुधारया जा सकता है?

उत्तर

0

की तरह तो अंदर एपीआई नियंत्रक कुछ जब से मैं एक बेहतर तरीका नहीं मिला है, न तो दस्तावेज है और न ही कहीं भी, यह भी सही प्रतीत हो रहा है और मैं इसे का उपयोग कर कुछ समय के बाद समस्याओं सामना नहीं किया है, यह दिखाई एपीआई संस्करण के लिए एक अच्छा दृष्टिकोण होने के लिए।

वैसे भी, मैं आपके एपीआई के पुराने समर्थित संस्करणों के व्यवहार को बदलने के लिए इस दृष्टिकोण का उपयोग करके सावधानी बरतता हूं। ध्यान से परीक्षण करें और पुराने ग्राहकों के लिए बहिष्करण और समर्थन हटाने के लिए अपने ग्राहकों को सूचित करें।

5

मुझे लगता है कि आपके पास यहां क्या है ठीक है। मैं एक ही दृष्टिकोण का उपयोग कर रहा हूं और यह मेरे आवेदन के लिए ठीक काम करता है। मैं जहां उसने किया रयान बेट्स से यहाँ मूल विचार उठाया बहुत समान दृष्टिकोण

http://railscasts.com/episodes/350-rest-api-versioning

बताते हैं यह है कि मैं क्या प्रत्येक संसाधन के लिए अलग serializers निर्दिष्ट करने के लिए उपयोग करते हैं:

module API 
    module V3 
    class AssetController < API::V3::ApiController 
     def index 
     render json: assets, status: :ok, each_serializer: API::V3::Serializers::AssetSerializer 
     end 
    end 
end 

मेरी कार्यान्वयन में मैं कर रहा हूँ एपीआई/नियंत्रकों/एपीआई/वी 3/सीरियलाइज़र के अंदर सीरियललाइज़र का उपयोग करना। तो तुम serializers वर्गों और नियंत्रक वर्गों

सुनिश्चित नहीं हैं कि क्या तुम सच में आप api अंतिम बिंदुओं का एक बहुत है, तो उन्हें संसाधनों में व्यवस्थित करने के लिए कोशिश के बाद से इस अधिक स्पष्ट नहीं बल्कि एक बड़ी बात

है get_serializer की आवश्यकता है वर्ज़निंग कर रहे हैं । मेरी config/routes.rb में मैं 700 के बारे में संसाधन हैं तो मैं उन्हें अलग फ़ाइलों config/API/v1/routes.rb में विभाजित ...

namespace :api, defaults: {format: 'json'} do 
    namespace :v1 
    resources :assets 
    end 
end 

इसके अलावा यह inflections.rb प्रारंभकर्ता

अंदर करने के लिए उपयोगी है
ActiveSupport::Inflector.inflections(:en) do |inflect| 
    inflect.acronym 'API' 
end 

मेरे लिए मैं कहूंगा कि सबसे अच्छा महत्वपूर्ण मुद्दा अच्छा परीक्षण कवरेज होना है। मैं spec पसंद करते हैं और सही स्थिति कोड 200, 201, के लिए जांच ...आदि के साथ-साथ json_schema

का उपयोग कर सही बेटा आउटपुट यदि आपको ऑथ करने की आवश्यकता है तो मैं सुझाव दूंगा कि आप टोकन आधारित ऑथ और जेडब्ल्यूटी - जेएसओएन वेब टोकन का उपयोग करें। मेरे कार्यान्वयन में मैं दो टोकन का उपयोग कर रहा हूं। पोस्ट और पैच करते समय पढ़ने और अलग टोकन के लिए एक टोकन (सुनिश्चित नहीं है कि इसकी आवश्यकता हो सकती है)। इस

class ApiController < ActionController::Base 
    skip_before_action :verify_authenticity_token, if: :json_request? 
    before_action :authenticate 

    protected 
    def json_request? 
    request.format.json? 
    end 
    if request.headers['X-Authorization'] 
    token = request.headers['X-Authorization'] 
    payload = JWT.decode(token, 'my_custom_key_to_check_if_key_has_been_tempered d_on_client_side')[0] 
    end 
end 
+0

आपके इनपुट के लिए धन्यवाद! मैंने कुछ चीजों को कम करने के लिए ऐसा किया है। 'get_serializer' हमेशा एएमएस द्वारा बुलाया जाता है और मुझे केवल' रेंडर जेसन: @object, serializer: नेमस्पेस्ड :: अपरंपरागत :: ऑब्जेक्टसेरियलाइज़र 'का उपयोग करने की आवश्यकता होती है, यदि यह परिभाषित सम्मेलन का पालन नहीं करता है। –