J'ai quelques plugins Engine avec des extrémités métalliques qui implémentent des services web extrêmement simples que j'ai l'intention de partager entre plusieurs applications. Ils fonctionnent bien comme ils le sont, mais évidemment, en les chargeant localement pour le développement et les tests, l'envoi de Net :: HTTP à get_response pour demander à localhost une autre page à l'intérieur de l'objet contrôleur en cours entraîne un blocage instantané. Voici donc ma question: le système de routage de Rails (ou Rack) permet-il de consommer en toute sécurité un service Web qui peut ou non faire partie de la même application sous la même instance de serveur, ou devrais-je pirater un cas spécial avec render_to_string pour les moments où le nom d'hôte dans l'URI correspond au mien?Sous-demandes ré-entrant dans Rack/Rails
Répondre
Il ne fonctionne pas en développement car il ne traite qu'une seule requête à la fois et la requête du contrôleur reste bloquée. Si vous en avez besoin, vous pouvez exécuter plusieurs serveurs localement derrière un équilibreur de charge. Je recommande d'utiliser Passenger même pour le développement (et le prefpane si vous êtes sur OS X).
Je vous recommande de séparer les services web internes et les applications qui les utilisent. De cette façon, vous ne dupliquez pas le code et vous pouvez facilement les mettre à l'échelle et les contrôler individuellement.
Ceci est en effet possible. Cependant, vous devez vous assurer que les services que vous appelez ne s'appellent pas récursivement.
Un très simple "rentrants" middleware Rack pourrait fonctionner comme ceci:
class Reentry < Struct.new(:app)
def call(env)
@current_env = env
app.call(env.merge('reentry' => self)
end
def call_rack(request_uri)
env_for_recursive_call = @current_env.dup
env_for_recursive_call['PATH_INFO'] = request_uri # ...and more
status, headers, response = call(env_for_recursive_call)
# for example, return response as a String
response.inject(''){|part, buf| part + buf }
end
end
Puis dans le code d'appel:
env['reentry'].call_rack('/my/api/get-json')
Un cas d'utilisation très valable pour cela Sideloading réponses API JSON format dans votre page principale.
Évidemment, le succès de cette technique dépendra de la sophistication de votre pile Rack (car certaines parties de l'environnement Rack ne seront pas réutilisées).
- 1. Verrouillage réentrant
- 2. JPA Flush réentrant détecté
- 3. Non-réentrant C# timer
- 4. est WinINET réentrant?
- 5. DLL MFC multi-thread (réentrant)
- 6. Va_start (etc.) est-il réentrant?
- 7. Le gestionnaire d'événements TTimer.OnTimer est-il réentrant?
- 8. Comment traiter le modèle d'appel réentrant dans WCF?
- 9. Est-ce que match (Uri) de la classe UriMatcher est réentrant?
- 10. Qu'est-ce que la serrure et le concept Re-entrant en général?
- 11. Arrêt du temporisateur dans sa méthode de rappel
- 12. WCF Memory Performance InstanceContextMode
- 13. Problème d'exception lors de la reliaison DataViewGrid
- 14. Comment puis-je implémenter une synchronisation de type java (moniteurs) en utilisant l'API Win32?
- 15. Meilleure façon de résoudre un enregistrement DNS TXT sur des systèmes de type Linux/Unix/Posix/BSD?
- 16. yy_top_state() semble échouer avec flex
- 17. Dans l'opérateur dans Linq
- 18. manquant) dans paranthetical dans JQuery
- 19. Définir css dans() dans jquery
- 20. propriétés dans ComboBox dans WPF
- 21. DateTime dans PropertyGrid dans .NET
- 22. Problème dans indexOf dans javascript
- 23. Problème dans Application_Error dans Global.asax
- 24. Javascript dans Mobileweb dans ASP.NET
- 25. Liaison dans Combobox dans WPF
- 26. UIDatePicker dans PopoverView dans l'iPad
- 27. Insérer dans NameValueCollection dans .NET
- 28. Boutons dans AdvancedDataGrid dans Flex
- 29. RadUpload dans FormView dans RadAjaxPanel
- 30. extras dans une intention dans l'application Widget dans Android
Vous pouvez utiliser un objet Mock: le chapitre 13 dans le livre "Développement Web Agile avec Rails 2", qui sont essentiellement des stubs :) est passé à passer dessus (donc je ne suis pas un expert à ce sujet) – Shyam