Comme le REPOS, mettre en application le SAVON implique de produire des demandes et puis de manipuler la réponse. Considérant que la manipulation de la réponse de SAVON est semblable au résultat de REPOS, produire de la demande de SAVON est tout à fait différent.
À la différence du REPOS, il est plutôt rare de voir des demandes produites manuellement, bien qu'il puisse encore être fait. Généralement, des demandes de SAVON sont produites avec un outil générique (comme NuSOAP ou Pear:SOAP) ou avec une classe spécifique à l'application ou le module. La génération manuelle est couverte ici (un bon arrangement de la façon dont cela fonctionne viendra dans utile), aussi bien que NuSOAP.
Des outils spécifiques à l'application vont être ignorés, pour des raisons d'un couple. Par définition ils sont détail d'application, et donc pas très utiles en cet article générique. Deuxièmement, les outils ont les interfaces et les niveaux variables de fonctionnalité, et afin de faire la justice de matière qu'il exigerait un regard détaillé. En conclusion, je suis fermement de l'opinion que si vous pouvez figurer hors de la façon lui faire le travail avec NuSOAP (ou cru, pour cette matière), vous pouvez obtenir l'outil spécifique à l'application pour fonctionner aussi.
Produire des demandes de SAVON n'est pas manuellement trop différent de produire des demandes de REPOS. Le processus de produire de la demande et de la transmettre réellement est coupé en deux fonctions séparées, pour démontrer des buts.
|
|
Pour produire de la demande elle-même, j'ai choisi d'employer une corde précréée, et peuple simplement les valeurs priées au temps d'exécution. Il y a des options plus complexes (telles que créer le document dans SimpleXML, ou le créer à partir de zéro chacun couru), mais elles ne sont pas vraiment exigées :
functioncreaterequest($devkey, #,
#, #)
{
$request = "< ?xmlversion=\"1.0 \ "= de codage \" UTF-8
\ "standalone=\"no \ "? >
< SOAP-ENV:Envelope
/ de
xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope \"
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema \"
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance \"
>
< SOAP-ENV:Body >
< devkey xsi:type=\"xsd:int\">$devkey</devkey >
< action xsi:type=\"xsd:string\">$action</action >
< dactylographiez xsi:type=\"xsd:string\">$type</type
>
< mot-clé xsi:type=\"xsd:string\">$keyword</keyword >
</SOAP-ENV:Body >
</SOAP-ENV:Envelope > ";
retour # ;
}
Comme vous pouvez dire, la fonction est environ aussi simple simplement qu'elle peut obtenir. Notez que les variables URL-N'ONT pas été codées ; c'est parce qu'elles ne sont pas introduites le URL (il est également facile manquer des bruits évidents, mais lui).
En fait, appeler l'api pour transmettre la demande implique d'emprunter un certain code au premier exemple de REPOS, parce que la demande sera envoyée à cru cette fois.
functioncallsoapapi($data)
{
$url = "http://library.example.com/api/soap/search" ;
$url_info = parse_url($url) ;
centre serveur de $host =‘de $url_info[ '] ;
chemin de $path =‘de $url_info[ '] ;
Je pourrais avoir juste peuplé les variables de $host et de $path au début, mais ceci devrait être plus clair. Dans un système de production, vous pourriez sauver quelques cycles d'unité centrale de traitement par hardcoding ces éléments.
#, 80) ;
fputs($fp, "OBTIENNENT". "HTTP/1.1\r\n de $path") ;
fputs($fp, "centre serveur : ". #
") ;
fputs($fp, "acceptent : */* \r\n") ;
fputs($fp, "Accept-Charset:ISO-8859-1, utf-8;q=0.7,
*;q=0.7\r\n") ;
fputs($fp, "Connection:close\r\n") ;
fputs($fp, "Content-Type:application/soap+xml\r\n") ;
fputs($fp, "Contenu-Longueur : ".strlen($data).
"\r\n\r\n") ;
fputs($fp, "# ") ;
Ce bloc est presque identique à l'exemple précédent. L'exemple précédent était une demande de POTEAU, tandis que c'est une demande d'OBTENIR, un changement par lequel sera dicté avec quelqu'api vous travailliez. Le Contenu-Type en-tête est différent pour refléter exactement ce que vous envoyez et cette fois naturellement vous avez $data à envoyer, ainsi la Contenu-Longueur ne sera pas 0.
# = "" ;
while(!feof($fp))
{
#, 128) ;
}
fclose($fp) ;
list($http_headers, $http_content)=explode("\r\n\r\n",
#) ;
retour # ;
}
Cette section est également identique à l'exemple de REPOS. L'emballage de ces deux fonctions pour rechercher une réponse est seulement à peine intéressant la mention :
$request = createRequest('123 ', 'recherche ', 'book',
'style) ;
# = callsoapapi($request) ;
N'était pas trop dur !
À la différence du REPOS, vous ne pouvez pas simplement employer le file_get_contents() pour frapper l'api, parce que vous devez envoyer le corps de XML avec le file_put_contents() de demande ne travaillerez pas non plus, parce que vous avez besoin des retours de réponse (file_put_contents() un interne), mais il y a d'autres options. La poire (http://pear.php.net), par exemple, a un groupe de fonctions HTTP-SPÉCIFIQUES qui peuvent prendre une partie du mal de tête de créer manuellement la demande outre de vos mains, mais vous permet toujours toute la flexibilité que vous obtenez avec la création manuelle.
N'importe quoi autre qu'un programme monocoup, je recommanderais certainement d'aller chercher avec une certaine sorte d'un module de SAVON pour faciliter votre vie de codage. Bien que, si vous courez dans des problèmes, le cheminement d'eux vers le bas puisse être un peu une douleur. J'aime à l'aide d'une boîte locale de développement pendant le développement, ainsi début de choses allant de travers je peux employer un renifleur de paquet pour regarder le request/response sous sa forme crue.
Conceptuellement, employer NuSOAP n'est pas trop différent d'accomplir le charger manuellement. L'objet est initialisé, la charge utile est créée, et la demande est envoyée. La différence principale ici est que NuSOAP effectue tout le travail sale.
require('../lib/nusoap.php ') ;
$client = nouveau
soapclient("http://library.example.com/api/soap/wsdl/", rectifient) ;
Ici l'objet de $client est créé. Deux options sont disponibles en créant un nouveau soapclient : Vous pouvez ou indiquer le dossier de wsdl pour le service (et placer le deuxième paramètre pour rectifier), ou indiquez le point final pour l'appel (et placez le deuxième paramètre à faux). Autant que possible, j'aime employer le dossier de wsdl ; le module de NuSOAP peut déceler certaines de vos erreurs que la manière, et lui assure que différent demandez les types que tous vont au point final correct.
$params = array(
'devkey ' = > '123',
'action ' = > 'recherche ',
'type ' = > 'livre ',
'mot-clé ' = > 'modèle '
) ;
Préparer les paramètres pour la transmission est des méthodes d'un peu plus facilement que plus tôt.
# = 'http://library.example.com ';
$action = 'http://library.example.com/api/soap/search ';
$method = "SearchRequest" ;
$result = # call($method>,
array(‘SearchRequest '= >
#),
#, #) ;
En conclusion, les derniers paramètres sont placés, et l'appel lui-même est fait.
La manipulation d'une réponse d'une demande de SAVON n'est encore pas trop différente de la réponse de REPOS que—toutes les deux sont fournies dans les formats semblables de XML. La réponse de SAVON porte les éléments additionnels d'enveloppe et de corps, mais souvent des données de présent d'une façon semblable dans ces éléments. Il y a naturellement une certaine variation entre manipuler la réponse d'une demande manuelle et d'une demande de NuSOAP. Les deux méthodes sont présentées ici.
L'imitation du rendement produit avec la demande de REPOS emploie le code semblable, avec quelques modifications pour l'arrangement d'encapsulation utilisé avec du SAVON.
l'echo"You a recherché
for:{$xml->Body->LibrarySearchResponse->RequestInfo - >
keyword}<br > ";
l'echo"Here sont
your{$xml->Body->LibrarySearchResponse->ResponseInfo- >
ResultCount}
results<br > ";
foreach($xml->Body->LibrarySearchResponse->ResponseInfo->Item
COMME &$item)
{
faites écho "{# title>}
by{$item->Author}<br >" ;
}
Ceci produira du rendement identique comme demande de REPOS montrée plus tôt. Notez la syntaxe différente employée pour acquérir le mot-clé de recherche. Ce n'est pas un attribut cette fois, ainsi l'accès est différent.
L'accès de l'objet fourni par NuSOAP est peu un différent des méthodes employées avec SimpleXML, mais la structure de données interne est tout à fait semblable. La modification du code pour travailler avec l'objet de NuSOAP prend seulement quelques moments.
l'echo"You a recherché : ".
#
']
"<br >" ;
l'echo"Here sont votre
{#
']}
results<br > ";
foreach($xml['Body']['LibrarySearchResponse']['ResponseInfo']['Item
'] COMME &$item)
{
écho "{#‘titre ']} by{$item[‘Author']}<br >" ;
}
Avec NuSOAP, les données internes sont plus ou moins consulté la même manière qu'un choix associatif, ainsi plutôt que la méthode d'OO d'employer - > pour accéder à des éléments d'enfant, davantage d'information de rangée est incluse. Cet élément produira identiquement à l'exemple précédent.
Le SAVON est une méthode efficace de questionner APIs quand les frais généraux additionnels sont permis. L'encapsulation de tous les éléments tient compte de la lecture facile, et de la portée variable dans la demande. Créer des demandes de SAVON peut être aussi facile que l'écriture elles dehors une fois, puis des variables principales de remplacement justes. Alternativement, il peut également être accompli en utilisant un outil tel que NuSOAP. L'accès de la réponse de SAVON peut être accompli dans le plus ou moins la même façon que la réponse de REPOS quand la demande a été accomplie manuellement. Dans le cas des demandes accomplies NuSOAP, la méthode d'accès est structurellement identique, seulement à quelques changements mineurs à la syntaxe utilisée.
Online: 546 users browsing the articles directory
|
|