[RUBY] Confirmation et refactoring du flux de la requête au contrôleur dans [httpclient]

introduction

Auparavant, j'ai implémenté la saisie semi-automatique en utilisant la saisie semi-automatique de JQuery, ajax et httpclient, mais je ne pouvais en saisir que vaguement le contenu. Vérifiez le contenu lors de la refactorisation.

Tout d'abord, découpez la partie accédant à l'API externe dans une classe et placez-la dans le répertoire lib. lib/api_suggest.rb

require 'httpclient'
require 'json'

class ApiSuggest
  API_KEY = Rails.application.credentials.api[:API_KEY]
  API_URI = Rails.application.credentials.api[:API_URI]

  def self.suggest(keyword, max_num)
    uri = API_URI
    headers = {
      Authorization: "Bearer #{API_KEY}",
    }
    params = {
      keyword: keyword,
      max_num: max_num,
    }

    client = HTTPClient.new
    req = client.get(uri, body: params, header: headers)
    req
  end
end

Avant de refactoriser

    client = HTTPClient.new
    req = client.get(uri, body: params, header: headers)
    res = JSON.parse(req.body)
    res

Et, je faisais JSON.parse (req.body), Après refactoring

req = client.get(uri, body: params, header: headers)

Renvoie la partie req qui est le résultat de client.get au contrôleur tel quel,

Du côté du contrôleur app/controllers/suggests_controller.rb

require 'api_suggest'
class SuggestsController < ApplicationController
  SUGGEST_MAX_COUNT = 5
  def search
    @suggests = ApiSuggest.suggest(params[:keyword], SUGGEST_MAX_COUNT)

    render body: @suggests.body, status: @suggests.code
  end
end

Sur la 7ème ligne, rendez,

render body: @suggests.body, status: @suggests.code

En le mettant dans chaque paramètre, il n'est plus nécessaire de JSON.parse.

Et ce paramètre est app/assets/javascripts/suggest.js

$("#form").autocomplete ({
  source: function (req, res) {
    $.ajax({
      url: '/suggest',
      type: 'GET',
      cache: false,
      dataType: "json",
      data: { keyword: req.term },
  n    success: function (data) {
        res(data);
      },
      error: function (xhr, ts, err) {
 n       res(xhr, ts, err);
      }
    });
  }
});

Le flux est qu'il est renvoyé en dessous du succès d'ajax.

Vérifiez le flux global

Spécifié par l'option ajax ʻUrl: Une demande a été envoyée à '/ suggest'`, Par routage

get 'suggest',    to: 'suggests#search'

ʻLa méthode de recherche de app / controllers / suggestionss_controller.rb` est appelée,

  def search
    @suggests = ApiSuggest.suggest(params[:keyword], SUGGEST_MAX_NUM)
    render body: @suggests.body, status: @suggests.code
  end

ʻApiSuggest.suggest` entraîne une requête d'API externe sur httpclient

render body: @suggests.body, status: @suggests.code Est retourné,

ʻApp / assets / javascripts / suggestions.js` ajax

success: function (res) {
  resp(res);
},
error: function (xhr, ts, err) {
  resp(xhr, ts, err);
}

Il est retourné dans chaque cas de succès et d'échec. Le flux.

En savoir plus sur la partie ajax

L'option render body renvoie le corps de la valeur de retour, Renvoie le résultat d'une API externe dont l'état est un code d'état (200, 404, 500, etc.).

Lorsque vous le recevez du côté ajax, En ajax, reportez-vous au code d'état, évaluez les séries 200 et 300 comme d'habitude et exécutez le côté succès.

Si un autre code d'état est reçu, exécutez le côté erreur, Est en cours de traitement.

c'est tout.

À la fin.

Merci d'avoir lu jusqu'au bout: bow_tone1: J'apprends les rails à partir d'un état inexpérimenté parce que je change de travail. Je veux acquérir régulièrement les bonnes connaissances et devenir un ingénieur compétent. Alors que je continue à publier, je pense que les contributions pour cela augmenteront inévitablement, conduisant à la croissance. Pour le moment, je ne peux pas trouver d'excuses simplement parce que je suis un débutant, mais je pense qu'il y a beaucoup de choses qui ne vont pas avec le contenu du message et que je devrais ajouter, alors j'apprécierais que vous puissiez le signaler. Merci d'avoir lu cet article.

Recommended Posts

Confirmation et refactoring du flux de la requête au contrôleur dans [httpclient]
Comprendre le flux approximatif de la demande à la réponse dans SpringWebMVC
Je veux comprendre le flux des paramètres de demande de traitement Spring
De Java naissant (3 ans) à Node.js (4 ans). Et l'impression de retourner à Java
[Java] Flux de l'introduction de STS à la confirmation de la page dynamique sur l'hôte local (2/3)
L'histoire de l'oubli de fermer un fichier en Java et de l'échec
[Java] Flux de l'introduction de STS à la confirmation de la page dynamique sur l'hôte local (1/3)
Comment modifier le nombre maximum et maximum de données POST dans Spark
J'ai essayé de traduire la grammaire de R et Java [Mis à jour de temps en temps]
[Rails] Articles pour les débutants pour organiser et comprendre le flux de form_with
[Swift] Comment changer l'ordre des éléments de barre dans le contrôleur de barre d'onglets [Débutant]
Le chemin du clone de Git à la construction de l'environnement et à la participation au projet (le tout dans son intégralité)
ArrayList et le rôle de l'interface vu depuis List
Demande de Json dans le test unitaire du contrôleur à l'aide de MockMvc
De l'introduction de la conception à la création de la table des utilisateurs
Comment écrire Scala du point de vue de Java
[Pour les débutants] DI ~ Les bases de DI et DI au printemps ~
Convertit le tableau d'erreurs.full_messages en caractères et sortie
Comprendre les caractéristiques de Scala en 5 minutes (Introduction à Scala)
Langage Java du point de vue de Kotlin et C #
Liez la demande à n'importe quelle classe et recevez-la
Les objets de la liste étaient des références, non? Confirmation de
Classes et instances Java comprises dans la figure
Comment déterminer la demande de prélecture depuis le navigateur
En Java, je souhaite couper plusieurs caractères spécifiés uniquement du début et de la fin.
Je veux recréer le contenu des actifs à partir de zéro dans l'environnement construit avec capistrano
L'histoire de la montée de Spring Boot de la série 1.5 à la série 2.1 part2
[Rails] Comment enregistrer temporairement l'URL de demande d'un utilisateur qui n'est pas connecté et revenir à cette URL après la connexion
J'ai essayé de résumer les bases de kotlin et java
Accédez à l'abréviation à partir de 5 exemples de listes Java en italique
Commande pour vérifier le nombre et l'état des threads Java
L'histoire du lancement de données BLOB depuis EXCEL dans DBUnit
Comment obtenir les informations les plus longues de Twitter à partir du 12/12/2016
Corrigez le code de caractère en Java et lisez à partir de l'URL
Contribué à Gradle et a été nommé dans la note de publication
Comment dériver le dernier jour du mois en Java
[Rails] Où faire attention dans la description de la validation
Comment vérifier l'extension et la taille des fichiers téléchargés
Créer plus d'onglets et de fragments dans le fragment de BottomNavigationView
Authentification 802.1X au réseau du paramètre de liaison dans CentOS7
Je veux connaître la méthode du contrôleur où l'exception a été levée dans le ExceptionHandler de Spring Boot
Emplacement de la définition de la méthode Résumé de la vérification Lorsque défini dans le projet et Rails / Gem
[Java] Divers résumés joints aux chefs de classe et aux membres
Résiliation de Docker et Kubernetes: période de grâce de SIGTERM à SIGKILL
[Rails / Routing] Comment faire référence au contrôleur dans votre propre répertoire
[Rails] Comment obtenir l'URL de la source de transition et la rediriger
Il ne répond pas à la description en .js du fichier packs
[Java] Obtenez les dates des derniers lundi et dimanche dans l'ordre
[Swift5] Comment obtenir un tableau et un ensemble de différences entre les tableaux
Comment définir l'adresse IP et le nom d'hôte de CentOS8
[Webpacker] Résumé de l'installation de Bootstrap et jQuery dans Rails 6.0
Examinons la signification de "stream" et "collect" dans l'API Stream de Java.
Fixez le nom du fichier de guerre à celui défini dans Maven
Ce que j'ai fait lors de la migration de la série Spring Boot 1.4 vers la série 2.0
[jOOQ] Comment utiliser CASE WHEN dans la clause WHERE / AND / OR
Comment supprimer de grandes quantités de données dans Rails et problèmes
Méthode pour additionner le nombre d'années et obtenir la fin du mois