Error: Failed to load processor TracNav
No macro or processor named 'TracNav' found

This Document is also available in English


GET & Authentification

GET

Pour parcourir les liens public postés sur Blogmarks.net, il suffit juste de rapatrier cette url :

http://api.blogmarks.net/marks

Par défaut, les 30 derniers liens publiques postés sur Blogmarks.net sont envoyés.

Ce qui correspond aux paramètres suivant :

  • last : 30
  • order_type : DESC
  • order_by : created

Ainsi qu'à l'URL suivante :

http://api.blogmarks.net/marks?last=30&order_type=DESC&order_by=created

On peut donc récupérer les 10 liens les plus populaires, en rapatriant cette URL :

http://api.blogmarks.net/marks?last=10&order_by=popularity

Ecrivons notre première requête HTTP et récupérons le dernier lien ajouté :

GET /marks?last=1 HTTP/1.0
Host: api.blogmarks.net
Accept: application/atom+xml

Réponse du serveur :

HTTP/1.1 200 OK
Date: Mon, 07 Mar 2005 19:32:10 GMT
Server: Apache/1.3.26 (Unix) Debian GNU/Linux PHP/4.3.9-1.dotdeb.3
X-Powered-By: PHP/4.3.9-1.dotdeb.3
Content-length: 1293
Connection: close
Content-Type: text/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<feed
version="draft-ietf-atompub-format-05:do not deploy"
xmlns="http://purl.org/atom/ns#draft-ietf-atompub-format-05"
xmlns:bm="http://api.blogmarks.net/ns#">
<head>
	<title>Last public marks</title>
	<link rel="alternate" type="application/xhtml+xml" href="?last=1"/>
	<link rel="next" type="application/atom+xml" href="http://api.blogmarks.net/marks?last=1&amp;offset=1&amp;order_type=DESC&amp;order_by=created"/>
	<updated>2005-03-07T20:23:04Z</updated>
</head>
<entry>
	<id>tag:blogmarks.net,2005:marks,31171</id>
	<title type="TEXT">Kevin Kelly -- Cool Tools:Wall Full of Whiteboard</title>
	<link rel="related" href="http://www.kk.org/cooltools/archives/000679.php" type="text/html"/>
	<link rel="alternate" href="http://blogmarks.net/user/delicious.popular/archives/2005/03/#mark31171" type="application/xhtml+xml" title="Kevin Kelly -- Cool Tools:Wall Full of Whiteboard"/>
	<link rel="image" href="http://www.blogmarks.net/screenshots/2005/03/07/2d3eb782512a6aff2540f74a0a32bd3d.png" type="image/png"/>
	<updated>2005-03-07T20:23:04Z</updated>
	<published>2005-03-07T20:23:04Z</published>
	<author><name>delicious.popular</name></author>
	<edit>http://api.blogmarks.net/atom/marks/31171</edit>
	<bm:created>2005-03-07T20:23:04Z</bm:created>
</entry>
</feed>

Si vous voulez écrire tout ceci dans un script, nous recommandons d'utiliser une librairie HTTP comme par exemple Pear HTTP:Request (dans le cas ou vous utilisez php bien sûr ;)

<?php

require_once "HTTP/Request.php";

$req =& new HTTP_Request("http://api.blogmarks.net/marks?last=1");
$req->addHeader("Accept", 'application/atom+xml');

$response = $req->sendRequest();

if (PEAR::isError($response)) {
	echo $response->getMessage();
} else {
	$code = $req->getResponseCode();
	switch ( $code ) {
	  case 200:
	    $xml = $req->getResponseBody();
	    // Handle the resulting Atom response here
	    echo $xml;
	    break;
	  default:
	    echo $code . " Error\n";
	    break;
	}
	
}

?>

Pour votre curiosité, dans vanilla PHP, vous pouvez écrire ce code (pas de gestion d'erreur)

<?php

$request  = 'GET /marks?last=1 HTTP/1.0' . "\n";
$request .= 'Host: api.blogmarks.net' . "\n";
$request .= 'Accept: application/atom+xml' . "\n";
$request .= "\n";

$fp = fsockopen('api.blogmarks.net', 80, $errno, $errstr, 30);

fputs($fp,$request);

$response = '';
while ( !feof ( $fp ) ) {
	$line = fgets ($fp, 128);
	$response .= $line;
}
fclose($fp);

echo $response;

?>

Authentification

Maintenant, imaginons que vous vouliez récupérer vos liens et tags privés. Ceci nécessite une authentification. Comme expliqué par le Atom authentication tutorial de Mark Pilgrim, nous utilisons l'authentification WSSE Username Token.

Commençons avec ces 4 variables :

  • $Username : znarf
  • $Password : foo
  • $Nonce (a cryptographically random string ) : 15253654
  • $CreationTimestamp (the current time in W3CDTF format) : 2004-03-08T17:11:42Z

Dans notre implémentation, nous utilisons le hash md5 sur le password. Si vous avez le password original, hashé le, sinon utilisé celui déjà hashé.

Donc, éventuellement :

  • $PasswordHash = md5( $Password );

Créons le "digest" password :

  • $PasswordDigest = Base64 ( SHA1 ( $Nonce + $CreationTimestamp + $PasswordHash ) )

Il suffit donc d'ajouter deux lignes à l'en-tête HTTP et nous voilà authentifier. A noter le paramètre private est mis à TRUE pour pouvoir rapatrier les liens et tags privés.

GET /marks?last=30&private=true HTTP/1.0
Host: api.blogmarks.net
Accept: application/atom+xml
Authorization: WSSE profile="UsernameToken"
X-WSSE: UsernameToken Username="$Username", PasswordDigest="$PasswordDigest", Nonce="$Nonce", Created="$CreationTimestamp"

Le code PHP correspond est le suivant:

<?php

$Username = 'znarf';
$Password = 'foo';
$Nonce = rand( 1 , 100000000000000 );
$CreationTimestamp = date('Y-m-d\Th:i:s\Z');

$PasswordHash = md5( $Password );

$PasswordDigest = base64_encode( sha1( $Nonce . $CreationTimestamp . $PasswordHash  ) );

require_once "HTTP/Request.php";

$req =& new HTTP_Request("http://api.blogmarks.net/marks?last=1&private=true");
$req->addHeader("Accept", 'application/atom+xml');
$req->addHeader('Authorization', 'WSSE profile="UsernameToken"');
$req->addHeader('X-WSSE', 'UsernameToken Username="' . $Username . '",
      PasswordDigest="' . $PasswordDigest . '", Nonce="' . $Nonce . '", Created="' . $CreationTimestamp . '"');

$response = $req->sendRequest();

if (PEAR::isError($response)) {
	echo $response->getMessage();
} else {
	$code = $req->getResponseCode();
	switch ( $code ) {
	  case 200:
	    $xml = $req->getResponseBody();
	    // Handle the resulting Atom response here
	    echo $xml;
	    break;
	  default:
	    echo $code . " Error\n";
	    break;
	}
	
}

?>

Nous avons pris partis de traiter la gestion d'erreur avec le module PEAR mais le mieux est d'utiliser les composants prévus par le framework de votre choix.


voir aussi : Fr/AtomApiTutorial/Post, Fr/AtomApiTutorial/Put, AtomApiTutorial/Delete