Existe-t-il un moyen de consommer des services Web externes et d'afficher les résultats dans les vues?

11

J'ai un service Web externe, accessible à l'aide d'un appel HTTP (avec des paramètres passés en tant que chaîne de requête), et qui renvoie le résultat au format XML.

Je souhaite utiliser Drupal pour accéder à ce service Web (avec les paramètres souhaités) et afficher le résultat à l'aide de Views.

Il s'agit d'un exemple de requête et du résultat obtenu à partir du service Web que j'utilise.

Requête: http: //localhost/query.php? Cy = in & q = abcd & cat = 22
Résultat:

<?xml version="1.0"?>
<results>
<Jobs>
    <Job ID="111">
        <Title>Test one</Title>
        <Summary>Test one summary</Summary>
        <DateUpdated Date="2011-04-04 18:03:00">4/4/2011</DateUpdated>
        <Location>
            <Country>India</Country>
            <City>Delhi</City>
        </Location>
        <CompanyName>Test Company</CompanyName>
    </Job>
    <Job ID="222">
        <Title>Test two</Title>
        <Summary>Test two summary</Summary>
        <DateUpdated Date="2011-04-04 18:03:00">4/4/2011</DateUpdated>
        <Location>
            <Country>India</Country>
            <City>Chennai</City>
        </Location>
        <CompanyName>Test company</CompanyName>
    </Job>
</Jobs> 
</results>  
Mugunth
la source

Réponses:

4

Les solutions conseillées sont basées sur la première introduction des données dans la base de données, puis sur leur affichage dans les vues.

Une alternative consiste à interroger le service directement à partir de Views, à l'aide d'un backend de requête personnalisé. Consultez http://drupal.org/node/958270 pour des liens vers des backends personnalisés que vous pouvez utiliser comme exemple pour écrire le vôtre (ce n'est pas beaucoup de travail)

Bojan Zivanovic
la source
Bien sûr, mais les avantages d'obtenir d'abord les données dans la base de données sont plus que la simplicité, cela signifie également la mise en cache des données. L'interrogation d'une banque de données locale est toujours plus rapide qu'un service externe.
Alex Weber
Mais, drupal.org/node/958270 est avec l'utilisation de Views3.0. Est-il possible de ne pas utiliser Views 3.0 et également sans avoir besoin d'enregistrer les données dans db? Consommez simplement le service Web en temps réel et affichez les données sur la page.
Bien sûr, cela va de soi.
Bojan Zivanovic
La vue 2 est presque en fin de vie, donc toutes les nouvelles fonctionnalités sont dans la vue 3.
Bojan Zivanovic
@Alex: Vous pouvez utiliser Views 3 avec un Webservice externe et toujours mettre en cache les résultats.
s.Daniel
3

Le module Flux peut extraire du contenu et le transformer en nœuds. Feeds XPath Parser vous permettra d'analyser le fichier xml et de mapper les balises aux champs. Vous pouvez ensuite utiliser des vues pour afficher le contenu normalement.

Carolyn
la source
1

Je suis sûr qu'il existe une solution plus élégante, mais je l'ai fait dans le passé avec des flux Twitter et cela fonctionne très bien. Voici mon point de vue:

  • Créez un type de contenu pour stocker vos résultats et configurez les champs nécessaires pour correspondre au contenu que vous consommerez
  • Créer un module qui implémente hook_cron () et consomme périodiquement le service Web et stocke les résultats sous forme de nœuds

La deuxième étape peut être réalisée en créant par programmation les instances de nœud:

$node = new stdClass();
$node->title = 'title';
$node->my_custom_field['und'][0]['value'] = 'my custom value';
// fill all your other fields
node_save($node);
  • La meilleure façon d'éviter la duplication lors de la création des nœuds par programmation serait de comparer l'ID (ou l'horodatage, ou autre) des résultats du service Web à l'entrée la plus récente de la base de données:
SELECT fdfpi.field_picture_id_value FROM field_data_field_picture_id fdfpi INNER JOIN node n ON fdfpi.entity_id = n.nid AND fdfpi.entity_type = 'node' WHERE n.type = 'picture' ORDER BY n.created DESC LIMIT 1

L'exemple ci-dessus peut sembler un peu déroutant mais ce n'est pas vraiment: j'ai créé un type de contenu "image" qui a un champ personnalisé "image_id". C'est juste un moyen manuel de récupérer l'ID du nœud le plus récemment créé de ce type.

  • Alors maintenant que vous avez un type de contenu spécifique que vous remplissez automatiquement au moment de la cron ... profit! Vous pouvez utiliser des vues pour afficher les données comme bon vous semble, car elles se présentent sous la forme d'anciens nœuds Drupal! :)

J'espère que cela t'aides!

Alex Weber
la source