% CVSId: $Id: adulau.tex,v 1.1 2003/02/07 17:51:53 adulau Exp adulau $
%
%
%     Copyright (c)  2001,2002,2003  Alexandre Dulaunoy <adulau@foo.be>
%     Permission is granted to copy, distribute and/or modify this document
%     under the terms of the GNU Free Documentation License, Version 1.2
%     or any later version published by the Free Software Foundation;
%     with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
%     A copy of the license is included in the section entitled "GNU
%     Free Documentation License".
\documentclass[%
pdf,
%nocolorBG,
colorBG,
slideColor,
%slideBW,
%draft,
frames
%azure
%contemporain
%nuancegris
%troispoints
%lignesbleues
%darkblue
%alienglow
%autumn
]{prosper}
\usepackage{amsmath}
\usepackage[T1]{fontenc}
\usepackage{pslatex}
\usepackage[french,english]{babel}
%\usepackage{listings}

\begin{document}
\title{Sécurité en ingénierie du Logiciel}
\subtitle{Le cadre des Web Services \\ {\em Partie 4 : Introduction à XML-RPC}}
\author{Alexandre Dulaunoy}
\email{adulau@foo.be}
\maketitle

\begin{slide}{Agenda}
\begin{itemize}
\item Introduction
\item Format des requêtes
\item Encodage et structure des données
\item Format des réponses
\item Format des erreurs
\item Exemples
\end{itemize}
\end{slide}

\begin{slide}{Introduction}
XML-RPC (Avril 98) - http://www.xmlrpc.com/
\begin{itemize}
\item  Norme  non-W3C   (Dave  Winer/Userland  Software)  réalisée  en
  réaction à SOAP,
\item Est une simple description d'interface entre un client et un serveur,
\item Représentation en XML,
\item Simple et efficace (plusieurs implémentations),
\item (trop simple - gestion des erreurs, routage, ...),
\item Les messages XML-RPC sont (souvent) des méthodes POST,
\end{itemize} 
\end{slide}

\begin{slide}{Format des requêtes}

POST /RPC2 HTTP/1.0\\
User-Agent: Frontier/5.1.2 (WinNT)\\
Host: betty.userland.com\\
Content-Type: text/xml\\
Content-length: 181\\


<?xml version="1.0"?>\\
<methodCall>\\
<methodName>examples.getStateName</methodName> \\
<params>\\
<param>\\
<value><i4>41</i4></value> </param> </params> </methodCall> \\
\end{slide}

\begin{slide}{Format des requêtes}
Headers
\begin{itemize}
\item URI sur le serveur HTTP pour la gestion des appels XML-RPC,
\item (dans l'exemple, c'est vers RPC2),
\item Le Host: doit être spécifié ainsi que le User-Agent:,
\item Le Content-Type: est toujours text/xml,
\item Le Content-Length: doit être spécifié et correct,
\end{itemize}
\end{slide}

\begin{slide}{Format des requêtes}
Payload
\begin{itemize}
\item Payload doit être en XML,
\item La  <methodCall> doit contenir  un <methodName> pour  la méthode
  (procédure,...) à appeler,

\item  Si  la méthode  possède  des  paramètres,  il faut  une  balise
  <params>,
\item <params> peut contenir  plusieurs éléments <param> qui possèdent
  une valeur <value>,
\end{itemize}
\end{slide}

\begin{slide}{Encodage et structure des données}
\begin{itemize}
\item <value>  possède plusieurs types dans XML-RPC  suivant le format
  des données scalaires,
\item <i4> or <int> - (four-byte signed integer),
\item <boolean> - (0 (false) or 1 (true)),
\item <string> - (string),
\item <double> - (double-precision signed floating point number),
\item <dateTime.iso8601> - date/time,
\item <base64> base64-encoded binary,
\end{itemize}
par défaut, c'est un 'string'.
\end{slide}

\begin{slide}{Encodage et structure des données}
<value> peut être aussi une 'structure' <struct>
\begin{itemize}
\item Une structure <struct> contient des <member> et chaque <member> peut contenir un <name> et une <value>. 
\end{itemize}
<struct>\\
   <member>\\
      <name>lowerBound</name>\\
      <value><i4>18</i4></value>\\
      </member>\\
   <member>\\
      <name>upperBound</name>\\
      <value><i4>139</i4></value>\\
    </member>\\
 </struct>\\
\end{slide}

\begin{slide}{Encodage et structure des données}
<value> peut être aussi un tableau <array>. 

Un <array> contient une rangée  d'élément <data> qui peut contenir une
ou plusieurs <value>. 

<array>\\
   <data>\\
      <value><i4>909</i4></value>\\
      <value><string>Klaus S.</string></value>\\
      <value><boolean>0</boolean></value>\\
      <value><i4>-31</i4></value>\\
   </data>\\
</array>\\

\end{slide}

\begin{slide}{Format des réponses}
HTTP/1.1 200 OK\\
Connection: close\\
Content-Length: 158\\
Content-Type: text/xml\\
Date: Fri, 17 Jul 1998 19:55:08 GMT\\
Server: UserLand Frontier/5.1.2-WinNT\\

<?xml version="1.0"?>\\
<methodResponse>\\ 
<params>     <param>\\
<value><string>South    Dakota</string></value>   </param>   </params>\\
</methodResponse> \\
\end{slide}

\begin{slide}{Format des réponses}
Sauf si  il y a  une erreur du  serveur HTTP, il retourne  toujours un
code 200 OK. 
\begin{itemize}
\item Le Content-Type: est toujours text/xml. 
\item Le Content-Length: est présent. 
\item La <methodResponse> doit contenir un <param> et ne peut contenir
  qu'un <params> qui contient une <value>,
\item La <methodResponse> peut  aussi contenir un <fault> qui contient
  une <value> avec une <struct> contenant deux éléments : faultCode (un
  int) et un faultString (un string).
\end{itemize}
\end{slide}

\begin{slide}{Format des erreurs - exemple}
HTTP/1.1 200 OK\\
Connection: close\\
Content-Length: 426\\
Content-Type: text/xml\\
Date: Fri, 17 Jul 1998 19:55:02 GMT\\
Server: UserLand Frontier/5.1.2-WinNT\\

<?xml   version="1.0"?>  <methodResponse>  <fault>   <value>  <struct>
<member>  <name>faultCode</name> <value><int>4</int></value> </member>
<member>      <name>faultString</name>     <value><string>Too     many
parameters.</string></value>  </member>  </struct>  </value>  </fault>
</methodResponse> 
\end{slide}

\begin{slide}{XML et Services Web}
L'exemple Meerkat :
<?xml version=''1.0'' encoding=''iso-8859-1''?>\\
<methodCall>\\
<methodName>meerkat.getChannelsByCategory</methodName>\\
<params>\\
<param><value><i4>2</i4></value></param>\\
</params>\\
</methodCall>\\
\end{slide}

\begin{slide}{Exemple Perl - Frontier XML-RPC}
\small{
\begin{verbatim}
use Frontier::Client;  
# Make an object to represent the XML-RPC server.
$server_url = '
http://xmlrpc-c.sourceforge.net/api/sample.php';
$server = Frontier::Client->new(url => $server_url);
# Call the remote server and get our result.
$result = $server->call('sample.sumAndDifference', 
5, 3);
$sum = $result->{'sum'};
$difference = $result->{'difference'};
print "Sum: $sum, Difference: $difference\n";\\
\end{verbatim}}
\end{slide}


\begin{slide}{Q\&R}
\begin{itemize}
\item adulau@foo.be
\item http://www.foo.be/cours/securite-webservices/
\item 3B12 DCC2 82FA 2931 2F5B  709A 09E2 CD49 44E6 CBCD
\end{itemize}
\end{slide}

\end{document}

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: t%%% End: 
