{"action":"created","comment":{"url":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/comments/25600912","id":25600912,"diff_hunk":"@@ -0,0 +1,131 @@\n+*Salut toi, alors comme ça tu fais du web ? et tu fais quoi de beau en ce moment ? Des plugins script.aculo.us ? Intéressant... je te conseille toutefois de jeter un coup d'oeil à cet article si jamais tu veux vraiment te la péter en soirée avec tes réflexions du style *\"Je fais du web\"* !*\n+\n+## Les webservices ##\n+La première étape pour devenir un beau gosse du web: comprendre ce que l'on entend par webservice ! Et bien c'est très facile, quand tu te promènes sur le skyblog de ta petite soeur ou encore quand tu likes les duck faces de ton amour de vacances, ce qui se passe c'est que ton navigateur discute avec le serveur web distant. Il envoie des requêtes du style *\"donne moi la page des posts skyblog de ma petite soeur\"* et le serveur renvoie du code HTML, des images et des feuilles de styles. Le tout est interprété par ton navigateur et toi tu peux ainsi jouir de cette page bien girly, pleine de licornes et d'arcs-en-ciel.\n+\n+Pourquoi passer par un navigateur si on veut juste récupérer de l'information brute ? Le web peut être consommé par des machines ! Les serveurs web nous renvoient bien plus de choses que de l'HTML, heureusement !\n+\n+### La première école : SOAP ###\n+Imaginons deux programmes  qui veulent discuter en passant par le web. Dans les années 90, des mecs super brillants se sont dit : *\"on va se baser sur le XML pour faire communiquer nos programmes sur le web\"*.\n+L'approche est assez logique et ingénieuse. Tout d'abord, les deux partis (le client et le serveur) se partagent une notice d'utilisation : la WSDL (Web Service Description Language), qui est un document XML décrivant toutes les méthodes qui peuvent être appelées par le client sur le serveur, avec les structures de données disponibles pour ces échanges.\n+Le client prépare donc sa demande et l'enveloppe dans une grosse structure XML contenant toutes les metadonnées (méthode appelée, signature numérique, etc...). Une fois que le serveur a reçu cette demande, il l'a traite et répond aussi dans une grosse enveloppe XML\n+\n+Tu viens de comprendre le SOAP (Service Oriented Application Protocol), aucun rapport avec une quelconque savonnette du coup. Cette méthode a fait ses preuves puisqu'elle fait tourner encore aujourd'hui des milliers de systèmes très complexes et très fiables.\n+\n+### La maison d'en face : ReST ###\n+Plusieurs années sont passées et les esprits ont évolué. On a commencé à entendre des grandes déclarations comme *\"Le SOAP c'est vraiment lourdingue !\"*, *\"Le protocole HTTP est sous-exploité !\"* ou encore *\"Les enveloppes XML et les WSDL ? merci bien !\"* et c'est à ce moment là qu'on a donné un acronyme bidon pour décrire le protocole HTTP sans vraiment le nommer : ReST (Representational State Transfert). Pour l'anecdote, tout le monde s'accorde à dire que cet acronyme ne veut rien dire ;)\n+\n+Le but du jeu est donc d'utiliser au maximum les possibilités du protocole HTTP, les verbes, les URLs et les codes retours pour décrire des APIs de la manière la plus fidèle possible. On a donc gagné en simplicité et la communication entre machine se veut désormais à la portée de tous. Je reviendrai en détail sur le protocole HTTP un peu plus tard.\n+\n+### Un partout : balle au centre ###\n+Je tiens à remettre les choses au clair. On entend beaucoup trop souvent *\"Fais du ReST, SOAP c'est nul\"*. Il y a en effet clairement un effet de mode ! Les APIs ReST pullulent et sont vraiment très pratiques. Toutefois, dans les gros systèmes nécessitant du RPC ou encore de la signature numérique, pour les échanges de données médicales par exemple, le contrat WSDL et la rigueur du XML sont clairement des alliés ! \n+\n+\n+## Alors comme ça, HTTP ça fait tout ? ##\n+Il y a un type qui s'appelle Leonard Richardson et qui a mis en place un [modèle de maturité](http://martinfowler.com/articles/richardsonMaturityModel.html) (un peu pompeux non ?) pour qualifier les APIs webservice.\n+\n+### Niveau 0 ###\n+C'est le minimum acceptable dans la communication HTTP:\n+* Toutes les requêtes sont envoyées à la même URL, quelque soit la demande.\n+* Toutes les requêtes sont envoyées avec le verbe POST\n+* Quelque soit le type de retour (donnée ou erreur), le code HTTP retourné par le serveur sera toujours 200 (OK, tout s'est bien passé)\n+* Le contenu échangé est majoritairement du XML (pour les enveloppes notamment)\n+\n+Quand on fait du webservice avec SOAP, c'est ce niveau qui est utilisé lors de la communication HTTP.\n+\n+### Niveau 1 ###\n+Avec ce premier niveau, on essaye d'enrichir un peu plus l'utilisation. On ajoute la notion de *ressource*, en fonction de la donnée métier manipulée, l'URL de la requête sera différente. La preuve par l'exemple:\n+* ***POST /agenda*** : permet de travailler avec les données de l'agenda de l'application\n+* ***POST /customers*** : permet de travailler avec le registre des clients  \n+\n+On profite aussi de la vue hiérarchique que nous proposent les URLs :\n+* ***POST /customers/42*** : permet de travailler avec le client qui possède l'identifiant 42\n+\n+Rien qu'en traçant les URLs appelées sur le serveur, on peut comprendre ce que le client HTTP cherche à faire... pas dégueu non ?\n+\n+### Niveau 2 ###\n+Le protocole HTTP utilise des verbes pour les requêtes et des codes numériques pour les retours. Ce sont ces deux mécanismes qui seront utilisés en complément du niveau 1.\n+\n+Les principaux verbes HTTP que l'on utilise sont GET, POST, PUT et DELETE. Leur nom est déjà très évocateur.\n+* ***GET /customers/42*** pour récupérer les informations du client 42\n+* ***PUT /customers*** *(+ corps de la requête)* pour enregistrer un nouveau client\n+* ***POST /customers/42*** *(+ corps de la requête)* : pour mettre à jour les informations du client 42\n+* ***DELETE /customers/42*** : pour supprimer le client 42.\n+\n+Facile non ? La réponse du serveur devient tout aussi logique grâce aux codes HTTP.\n+Ces codes sont juste des nombres de 3 chiffres respectant cette logique :\n+* ***1xx*** : *\"Je suis en train de bosser, attends encore un peu\"*\n+* ***2xx*** : *\"Voilà le résultat, ça s'est bien passé\"*\n+* ***3xx*** : *\"Le contenu est déplacé, va voir ailleurs (cf entête location)\"*\n+* ***4xx*** : *\"Tu me demandes n'importe quoi, tu as merdé\"*\n+* ***5xx*** : *\"J'ai merdé...\"*\n+\n+Parmi les plus connus, on a donc 404 (*\"tu me demandes quelques chose qui n'existe pas\"*), 403 (*\"accès interdit\"*), 304 (*\"pas la peine de m'emmerder, la donnée est dans ton cache\"*) et bien sûr 200 (*\"OK, tout va bien\"*).\n+\n+Et si les codes HTTP sont ta nouvelle passion, je te suggère de te documenter sur le code [418](http://fr.wikipedia.org/wiki/Hyper_Text_Coffee_Pot_Control_Protocol) !\n+\n+\n+### Niveau 3 : HATEOAS ###\n+\n+Alors on a les verbes HTTP et les codes retours. A quoi peut ressembler le Graal des APIs ReST alors ? Si on réfléchit un peu, on peut se dire qu'il faudrait, pour toutes les URLs, donner un code retour HTTP cohérent pour chaque verbe, logique non ? De cette manière, on peut entamer un véritable dialogue avec le serveur HTTP, entièrement basé sur ReST. Voilà une bonne nouvelle pour ceux qui veulent tailler une bavette ailleurs que sur Google Hangouts !\n+\n+Un petit exemple de dialogue : \n+\n+```\n+> GET /customers/42\n+200 OK\n+\n+> PUT /customers/42 {...}\n+409 Conflict\n+\n+> DELETE /customers/42\n+204 No Content\n+\n+> GET /customers/42\n+404 Not Found\n+```\n+\n+C'est un bon début, mais ce niveau 3 va quand même un peu plus loin ! Toi, lecteur... n'as-tu jamais trouvé génial qu'avec de simples liens dans les pages web, tu pouvais naviguer des heures et des heures ? \n+\n+Pourquoi ne pas ajouter des liens dans les ressources retournées via ReST ? Nous venons de mettre le doigt sur HATEOAS (*Hypermedia As The Engine Of Application State*). On peut désormais imaginer un tas de chose comme:\n+* Quand on renvoie un tableau json par exemple, dans chaque item, \n+  * on peut ajouter les liens qui permettent de le mettre à jour\n+  * on peut ajouter les liens qui permettent de récupérer des données liées comme l'auteur d'un livre, les mentions d'un tweet, etc...\n+  * on peut ajouter l'url de putaindecode.fr\n+\n+Voici un exemple de trame JSON avec les informations HATEOAS. Pour information, il s'agit d'un webservices qui permet de lister des conférences.\n+\n+<figure>\n+    ![JSON HATEOAS](json_annote.png)\n+    <figcaption>JSON avec liens Hypermedia</figcaption>\n+  </figure>\n+\n+\n+## Est-ce que c'est standard ? ##\n+\n+Et bien non ! Il n'y a pas vraiment de convention pour l'écriture des liens dans les trames renvoyées. Cela dépend du format renvoyé dans un premier temps. Comment formaliser un standard si on renvoie en JSON, XML et YML en fonction des entêtes HTTP du client ?\n+\n+De la même manière, tu auras remarqué, lecteur, que l'on ne précise pas le verbe HTTP à utiliser sur les URLs. C'est la raison pour laquelle il faut implémenter un retour cohérent pour tous les verbes HTTP courants !","path":"src/pages/posts/api/hateoas/index.md","position":108,"original_position":108,"commit_id":"30a54a69951ea309d50fb6da2f05c4a240ebc41f","original_commit_id":"30a54a69951ea309d50fb6da2f05c4a240ebc41f","user":{"login":"MoOx","id":157534,"avatar_url":"https://avatars.githubusercontent.com/u/157534?v=3","gravatar_id":"","url":"https://api.github.com/users/MoOx","html_url":"https://github.com/MoOx","followers_url":"https://api.github.com/users/MoOx/followers","following_url":"https://api.github.com/users/MoOx/following{/other_user}","gists_url":"https://api.github.com/users/MoOx/gists{/gist_id}","starred_url":"https://api.github.com/users/MoOx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MoOx/subscriptions","organizations_url":"https://api.github.com/users/MoOx/orgs","repos_url":"https://api.github.com/users/MoOx/repos","events_url":"https://api.github.com/users/MoOx/events{/privacy}","received_events_url":"https://api.github.com/users/MoOx/received_events","type":"User","site_admin":false},"body":"tu peux supprimer \", lecteur\"","created_at":"2015-03-02T14:22:38Z","updated_at":"2015-03-02T14:22:38Z","html_url":"https://github.com/putaindecode/putaindecode.fr/pull/345#discussion_r25600912","pull_request_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/345","_links":{"self":{"href":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/comments/25600912"},"html":{"href":"https://github.com/putaindecode/putaindecode.fr/pull/345#discussion_r25600912"},"pull_request":{"href":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/345"}}},"pull_request":{"url":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/345","id":30245797,"html_url":"https://github.com/putaindecode/putaindecode.fr/pull/345","diff_url":"https://github.com/putaindecode/putaindecode.fr/pull/345.diff","patch_url":"https://github.com/putaindecode/putaindecode.fr/pull/345.patch","issue_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/issues/345","number":345,"state":"open","locked":false,"title":"Post.hateoas","user":{"login":"awillemant","id":1036471,"avatar_url":"https://avatars.githubusercontent.com/u/1036471?v=3","gravatar_id":"","url":"https://api.github.com/users/awillemant","html_url":"https://github.com/awillemant","followers_url":"https://api.github.com/users/awillemant/followers","following_url":"https://api.github.com/users/awillemant/following{/other_user}","gists_url":"https://api.github.com/users/awillemant/gists{/gist_id}","starred_url":"https://api.github.com/users/awillemant/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/awillemant/subscriptions","organizations_url":"https://api.github.com/users/awillemant/orgs","repos_url":"https://api.github.com/users/awillemant/repos","events_url":"https://api.github.com/users/awillemant/events{/privacy}","received_events_url":"https://api.github.com/users/awillemant/received_events","type":"User","site_admin":false},"body":"Veuillez trouver dans cette PR ma modeste contribution à P!\r\n\r\nC'est un article sur HATEOAS, l'hypermedia dans les APIs ReST.\r\n\r\nJe reste à votre disposition pour toute info complémentaire.\r\n\r\nMerci !","created_at":"2015-03-01T18:07:40Z","updated_at":"2015-03-02T14:22:39Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e4cdd9bd10a39766f44f096b66e3878c9970cf81","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/345/commits","review_comments_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/345/comments","review_comment_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/comments{/number}","comments_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/issues/345/comments","statuses_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/statuses/30a54a69951ea309d50fb6da2f05c4a240ebc41f","head":{"label":"awillemant:post.hateoas","ref":"post.hateoas","sha":"30a54a69951ea309d50fb6da2f05c4a240ebc41f","user":{"login":"awillemant","id":1036471,"avatar_url":"https://avatars.githubusercontent.com/u/1036471?v=3","gravatar_id":"","url":"https://api.github.com/users/awillemant","html_url":"https://github.com/awillemant","followers_url":"https://api.github.com/users/awillemant/followers","following_url":"https://api.github.com/users/awillemant/following{/other_user}","gists_url":"https://api.github.com/users/awillemant/gists{/gist_id}","starred_url":"https://api.github.com/users/awillemant/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/awillemant/subscriptions","organizations_url":"https://api.github.com/users/awillemant/orgs","repos_url":"https://api.github.com/users/awillemant/repos","events_url":"https://api.github.com/users/awillemant/events{/privacy}","received_events_url":"https://api.github.com/users/awillemant/received_events","type":"User","site_admin":false},"repo":{"id":28538090,"name":"putaindecode.fr","full_name":"awillemant/putaindecode.fr","owner":{"login":"awillemant","id":1036471,"avatar_url":"https://avatars.githubusercontent.com/u/1036471?v=3","gravatar_id":"","url":"https://api.github.com/users/awillemant","html_url":"https://github.com/awillemant","followers_url":"https://api.github.com/users/awillemant/followers","following_url":"https://api.github.com/users/awillemant/following{/other_user}","gists_url":"https://api.github.com/users/awillemant/gists{/gist_id}","starred_url":"https://api.github.com/users/awillemant/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/awillemant/subscriptions","organizations_url":"https://api.github.com/users/awillemant/orgs","repos_url":"https://api.github.com/users/awillemant/repos","events_url":"https://api.github.com/users/awillemant/events{/privacy}","received_events_url":"https://api.github.com/users/awillemant/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/awillemant/putaindecode.fr","description":"Oh les jolis articles...","fork":true,"url":"https://api.github.com/repos/awillemant/putaindecode.fr","forks_url":"https://api.github.com/repos/awillemant/putaindecode.fr/forks","keys_url":"https://api.github.com/repos/awillemant/putaindecode.fr/keys{/key_id}","collaborators_url":"https://api.github.com/repos/awillemant/putaindecode.fr/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/awillemant/putaindecode.fr/teams","hooks_url":"https://api.github.com/repos/awillemant/putaindecode.fr/hooks","issue_events_url":"https://api.github.com/repos/awillemant/putaindecode.fr/issues/events{/number}","events_url":"https://api.github.com/repos/awillemant/putaindecode.fr/events","assignees_url":"https://api.github.com/repos/awillemant/putaindecode.fr/assignees{/user}","branches_url":"https://api.github.com/repos/awillemant/putaindecode.fr/branches{/branch}","tags_url":"https://api.github.com/repos/awillemant/putaindecode.fr/tags","blobs_url":"https://api.github.com/repos/awillemant/putaindecode.fr/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/awillemant/putaindecode.fr/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/awillemant/putaindecode.fr/git/refs{/sha}","trees_url":"https://api.github.com/repos/awillemant/putaindecode.fr/git/trees{/sha}","statuses_url":"https://api.github.com/repos/awillemant/putaindecode.fr/statuses/{sha}","languages_url":"https://api.github.com/repos/awillemant/putaindecode.fr/languages","stargazers_url":"https://api.github.com/repos/awillemant/putaindecode.fr/stargazers","contributors_url":"https://api.github.com/repos/awillemant/putaindecode.fr/contributors","subscribers_url":"https://api.github.com/repos/awillemant/putaindecode.fr/subscribers","subscription_url":"https://api.github.com/repos/awillemant/putaindecode.fr/subscription","commits_url":"https://api.github.com/repos/awillemant/putaindecode.fr/commits{/sha}","git_commits_url":"https://api.github.com/repos/awillemant/putaindecode.fr/git/commits{/sha}","comments_url":"https://api.github.com/repos/awillemant/putaindecode.fr/comments{/number}","issue_comment_url":"https://api.github.com/repos/awillemant/putaindecode.fr/issues/comments{/number}","contents_url":"https://api.github.com/repos/awillemant/putaindecode.fr/contents/{+path}","compare_url":"https://api.github.com/repos/awillemant/putaindecode.fr/compare/{base}...{head}","merges_url":"https://api.github.com/repos/awillemant/putaindecode.fr/merges","archive_url":"https://api.github.com/repos/awillemant/putaindecode.fr/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/awillemant/putaindecode.fr/downloads","issues_url":"https://api.github.com/repos/awillemant/putaindecode.fr/issues{/number}","pulls_url":"https://api.github.com/repos/awillemant/putaindecode.fr/pulls{/number}","milestones_url":"https://api.github.com/repos/awillemant/putaindecode.fr/milestones{/number}","notifications_url":"https://api.github.com/repos/awillemant/putaindecode.fr/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/awillemant/putaindecode.fr/labels{/name}","releases_url":"https://api.github.com/repos/awillemant/putaindecode.fr/releases{/id}","created_at":"2014-12-27T14:07:29Z","updated_at":"2014-12-27T14:07:31Z","pushed_at":"2015-03-01T18:03:32Z","git_url":"git://github.com/awillemant/putaindecode.fr.git","ssh_url":"git@github.com:awillemant/putaindecode.fr.git","clone_url":"https://github.com/awillemant/putaindecode.fr.git","svn_url":"https://github.com/awillemant/putaindecode.fr","homepage":"http://putaindecode.fr","size":26642,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"putaindecode:master","ref":"master","sha":"de789efef9956dc2713f9c0985b9c4f3b57f386f","user":{"login":"putaindecode","id":4541781,"avatar_url":"https://avatars.githubusercontent.com/u/4541781?v=3","gravatar_id":"","url":"https://api.github.com/users/putaindecode","html_url":"https://github.com/putaindecode","followers_url":"https://api.github.com/users/putaindecode/followers","following_url":"https://api.github.com/users/putaindecode/following{/other_user}","gists_url":"https://api.github.com/users/putaindecode/gists{/gist_id}","starred_url":"https://api.github.com/users/putaindecode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/putaindecode/subscriptions","organizations_url":"https://api.github.com/users/putaindecode/orgs","repos_url":"https://api.github.com/users/putaindecode/repos","events_url":"https://api.github.com/users/putaindecode/events{/privacy}","received_events_url":"https://api.github.com/users/putaindecode/received_events","type":"Organization","site_admin":false},"repo":{"id":10319056,"name":"putaindecode.fr","full_name":"putaindecode/putaindecode.fr","owner":{"login":"putaindecode","id":4541781,"avatar_url":"https://avatars.githubusercontent.com/u/4541781?v=3","gravatar_id":"","url":"https://api.github.com/users/putaindecode","html_url":"https://github.com/putaindecode","followers_url":"https://api.github.com/users/putaindecode/followers","following_url":"https://api.github.com/users/putaindecode/following{/other_user}","gists_url":"https://api.github.com/users/putaindecode/gists{/gist_id}","starred_url":"https://api.github.com/users/putaindecode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/putaindecode/subscriptions","organizations_url":"https://api.github.com/users/putaindecode/orgs","repos_url":"https://api.github.com/users/putaindecode/repos","events_url":"https://api.github.com/users/putaindecode/events{/privacy}","received_events_url":"https://api.github.com/users/putaindecode/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/putaindecode/putaindecode.fr","description":"Oh les jolis articles...","fork":false,"url":"https://api.github.com/repos/putaindecode/putaindecode.fr","forks_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/forks","keys_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/keys{/key_id}","collaborators_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/teams","hooks_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/hooks","issue_events_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/issues/events{/number}","events_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/events","assignees_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/assignees{/user}","branches_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/branches{/branch}","tags_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/tags","blobs_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/git/refs{/sha}","trees_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/git/trees{/sha}","statuses_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/statuses/{sha}","languages_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/languages","stargazers_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/stargazers","contributors_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/contributors","subscribers_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/subscribers","subscription_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/subscription","commits_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/commits{/sha}","git_commits_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/git/commits{/sha}","comments_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/comments{/number}","issue_comment_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/issues/comments{/number}","contents_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/contents/{+path}","compare_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/compare/{base}...{head}","merges_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/merges","archive_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/downloads","issues_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/issues{/number}","pulls_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls{/number}","milestones_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/milestones{/number}","notifications_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/labels{/name}","releases_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/releases{/id}","created_at":"2013-05-27T17:08:41Z","updated_at":"2015-02-26T14:45:47Z","pushed_at":"2015-03-01T10:15:16Z","git_url":"git://github.com/putaindecode/putaindecode.fr.git","ssh_url":"git@github.com:putaindecode/putaindecode.fr.git","clone_url":"https://github.com/putaindecode/putaindecode.fr.git","svn_url":"https://github.com/putaindecode/putaindecode.fr","homepage":"http://putaindecode.fr","size":31829,"stargazers_count":48,"watchers_count":48,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":47,"mirror_url":null,"open_issues_count":33,"forks":47,"open_issues":33,"watchers":48,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/345"},"html":{"href":"https://github.com/putaindecode/putaindecode.fr/pull/345"},"issue":{"href":"https://api.github.com/repos/putaindecode/putaindecode.fr/issues/345"},"comments":{"href":"https://api.github.com/repos/putaindecode/putaindecode.fr/issues/345/comments"},"review_comments":{"href":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/345/comments"},"review_comment":{"href":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/345/commits"},"statuses":{"href":"https://api.github.com/repos/putaindecode/putaindecode.fr/statuses/30a54a69951ea309d50fb6da2f05c4a240ebc41f"}}}}