<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hawaii Interactive</title>
    <description>The latest articles on DEV Community by Hawaii Interactive (@hawaii).</description>
    <link>https://dev.to/hawaii</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F2716%2Fc42ccdc5-59d8-4058-898d-59c7b6785632.jpg</url>
      <title>DEV Community: Hawaii Interactive</title>
      <link>https://dev.to/hawaii</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hawaii"/>
    <language>en</language>
    <item>
      <title>Using Airtable as backend service</title>
      <dc:creator>Renaud Kern</dc:creator>
      <pubDate>Sun, 01 Nov 2020 09:42:36 +0000</pubDate>
      <link>https://dev.to/hawaii/using-airtable-as-backend-service-2ad7</link>
      <guid>https://dev.to/hawaii/using-airtable-as-backend-service-2ad7</guid>
      <description>&lt;h2&gt;
  
  
  The hell of finding the right backend
&lt;/h2&gt;

&lt;p&gt;When it's time to write a Single Page Application in javascript, we often need some sort of backend so that the site owne can add or update the content in the application.&lt;/p&gt;

&lt;p&gt;There is many possible alternative ways, from building a complexe REST application on dedicated framework such as Laravel or Ruby on Rails, to connecting your app to headless CMS.&lt;/p&gt;

&lt;p&gt;The problem with headless is that are most of the time costly and can be expersive after several years. Or you have to install and manage it on a virtual private server with all the security issues that comes with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Airtable Solution
&lt;/h2&gt;

&lt;p&gt;One quick and easy solution is to use &lt;a href="https://airtable.com/"&gt;Airtable&lt;/a&gt;. It comes with a free plan, REST API, and great documention.&lt;/p&gt;

&lt;p&gt;It's take a minute to create a table, less to alter columns, no migration is needed and it's super easy for the site owner to add the content. Think Airtable as a combination of Excel and Access, without the code and the hugly.&lt;/p&gt;

&lt;p&gt;It come with his own &lt;a href="https://airtable.com/universe"&gt;Univers&lt;/a&gt; and you'll probably find a template for your project.&lt;/p&gt;

&lt;p&gt;Nevertheless Airtable has a major gotcha that limit his usability for heavy applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemple
&lt;/h2&gt;

&lt;p&gt;Here is an &lt;a href="https://airtable.com/invite/l?inviteId=invM2yvDAcUIvCGZn&amp;amp;inviteToken=296e5808079128161543fe975d7cbccf9cd914cd4bfa6fc0c45429388625ec9a"&gt;Airtable&lt;/a&gt; base for building a Quiz with questions and answers. It comes with an awesome base specific &lt;a href="https://airtable.com/api"&gt;API documentation&lt;/a&gt; (you must be logged in to see it) and an official &lt;a href="https://github.com/Airtable/airtable.js"&gt;Javascript library&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Authentification
&lt;/h3&gt;

&lt;p&gt;Authentification is straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Airtable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;airtable&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;base&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Airtable&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;base&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;BASE_TOKEN&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fetching single record
&lt;/h3&gt;

&lt;p&gt;Here is how you can fetch a record with his ID (ID is created autonumber field):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;fetchQuiz&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;base&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Questions&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;select&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
          &lt;span class="na"&gt;filterByFormula&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="err"&gt;{ID} = &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstPage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;filterByFormula&lt;/code&gt; key is an Airtable &lt;a href="https://support.airtable.com/hc/en-us/articles/203255215-Formula-Field-Reference"&gt;Formula&lt;/a&gt; instruction that offers SQL like queries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fetching multiple records
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;base&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Questions&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;select&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="c1"&gt;// Selecting the first 20 records in Grid view.&lt;/span&gt;
    &lt;span class="c1"&gt;// You can also create you own view.&lt;/span&gt;
    &lt;span class="na"&gt;maxRecords&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;view&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Grid view&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;eachPage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;records&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fetchNextPage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// This function (`page`) will get called for each page of records.&lt;/span&gt;

    &lt;span class="nx"&gt;records&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Retrieved&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Question&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="c1"&gt;// To fetch the next page of records, call `fetchNextPage`.&lt;/span&gt;
    &lt;span class="c1"&gt;// If there are more records, `page` will get called again.&lt;/span&gt;
    &lt;span class="c1"&gt;// If there are no more records, `done` will get called.&lt;/span&gt;
    &lt;span class="nx"&gt;fetchNextPage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;done&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Creating
&lt;/h3&gt;

&lt;p&gt;Creating a single record is quite simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;base&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Questions&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Question&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;In vuejs, which directive is to used to attach event listeners that invoke methods?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getId&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Airtable javascript library offers also functions to create multiple records, update and delete records.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gotchas
&lt;/h2&gt;

&lt;p&gt;The API is limited to 5 requests per second... If you exceed this rate, you will receive an error and will need to wait 30 seconds before subsequent requests will succeed.&lt;/p&gt;

&lt;p&gt;So it definitely limit the use of Airtable for extensive application. But it can find a place for prototyping or building small application. For instance, at &lt;a href="https://hawaii.do/"&gt;Hawaii Interactive&lt;/a&gt; we used it to quickly build a swiss &lt;a href="https://quiz.explorateurs-energie.ch/"&gt;quiz on energy&lt;/a&gt; for schoolchildren.&lt;/p&gt;

</description>
      <category>airtable</category>
      <category>backend</category>
      <category>spa</category>
    </item>
    <item>
      <title>Quel framework choisir pour votre application REST en 2020 ?</title>
      <dc:creator>Renaud Kern</dc:creator>
      <pubDate>Sat, 24 Oct 2020 13:23:49 +0000</pubDate>
      <link>https://dev.to/hawaii/quel-framework-choisir-pour-votre-application-rest-en-2020-878</link>
      <guid>https://dev.to/hawaii/quel-framework-choisir-pour-votre-application-rest-en-2020-878</guid>
      <description>&lt;p&gt;Quelle solution choisir pour développer une API REST sur laquelle viendra s’appuyer votre application web ou mobile en 2020 ? Autrement dit, vous voulez construire une architecture logicielle pour créer des services web, mais vous hésitez entre plusieurs possibilités. Ou vous avez un framework fétiche et vous voulez le comparer avec des solutions existantes. Ce blog est certainement pour vous.&lt;br&gt;
L’architecture REST n’est pas nouvelle. Elle a été popularisée par un livre de Leonard Richardson et Sam Ruby (rien à voir avec le langage même s’il y a contribué…) RESTful Web APIs publié en 2007 par O’Reilly qui souligne la puissance des technologies web: protocol http, norme URI,... Surtout, elle établit une interopérabilité entre ordinateurs sur internet:  une petite révolution car les solutions alternatives à l’époque étaient SOAP ou RPC étaient et restent souvent incompréhensibles pour le développeur web. Désormais, nous pouvions façonner le web autrement que pour produire des pages HTML ! Ce fut donc l’ouverture vers de nouveaux outils comme React, Angular ou Vuejs.&lt;br&gt;
Toutefois, il faut garder en tête que l’architecture REST n’est pas un standard ou une norme, mais plutôt une somme de conventions et de pratiques. Il peut y avoir des différences entre les langages de programmation et frameworks. Nous verrons ici 3 solutions qui sont massivement utilisées comme serveur REST et qui sont comparables en termes d’utilisation.&lt;/p&gt;
&lt;h2&gt;
  
  
  Ruby On Rails, la Mère des framework web
&lt;/h2&gt;

&lt;p&gt;Les principes architecturaux REST ont été présenté en 2006 (avant la sortie du livre ci-dessous) lors de la Keynote de la Conférence Rails &lt;a href="https://fr.slideshare.net/vishnu/discovering-a-world-of-resources-on-rails"&gt;2006 Discovering a World of Resources on Rails&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Routes
&lt;/h3&gt;

&lt;p&gt;L’architecture REST a donc très tôt été intégrée dans le framework (dès la version 1.2) et il a été très facile d’intégrer une API dans une application. Pour générer les routes, une instructions suffit. Par exemple, l’instruction suivante:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;resources :photos&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;créée automatiquement les 7 routes emblématiques :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Verbe HTTP&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;URL&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Utilisation&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;/photos&lt;/td&gt;
&lt;td&gt;Affiche la liste de toutes les photos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;/photos/new&lt;/td&gt;
&lt;td&gt;Retourne les informations pour créer une nouvelle photo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;/photos&lt;/td&gt;
&lt;td&gt;Créée une photo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;/photos/:id&lt;/td&gt;
&lt;td&gt;Affiche une photo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;/photos/:id/edit&lt;/td&gt;
&lt;td&gt;Retourne les information pour mettre à jour une photo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PATCH/PUT&lt;/td&gt;
&lt;td&gt;/photos/:id&lt;/td&gt;
&lt;td&gt;Mets à jour une photo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DELETE&lt;/td&gt;
&lt;td&gt;/photos/:id&lt;/td&gt;
&lt;td&gt;Efface une photo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Vues
&lt;/h3&gt;

&lt;p&gt;A partir d’une action (route), il est possible de retourner plusieurs formats avec l’instruction respond_to :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;respond_to do |format|
    format.html
    format.json { render json: @photos }
    format.xml { render xml: @photos }
 end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notez également la simplicité pour générer du JSON ou XML à partir d’un enregistrement. Mais si vous avez besoin de rendre du contenu JSON plus complexe, il existe des langages de template comme &lt;a href="https://github.com/nesquena/rabl"&gt;RABL&lt;/a&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;collection @photos
cache @photos
attributes :id, :title, :subject
child(:user) { attributes :full_name }
node(:taken_by) { |photo| photo.taken_by?(@user) }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Spécificités
&lt;/h3&gt;

&lt;p&gt;Si vous souhaitez utiliser RoR uniquement pour produire une API sans page HTML, vous pouvez utiliser la commande :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rails new my_application --api&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;qui va créer une application plus légère et rapide sans les ressource nécessaire pour gérer le format HTML.&lt;br&gt;
Mais bien que Ruby on Rails (RoR) fut un des premier framework à embrasser l’architecture REST, les concepteurs fut frileux à utiliser javascript pour langage pour le frontend et a mis en avant d’autres technologies comme les turbolinks qui n’ont pas percés chez les développeurs. Sauf peut-être Yehuda Katz (ancien de JQuery également) qui quitta la “core team” pour lancer Ember.js, un des premier framework frontend JS.&lt;/p&gt;
&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;RoR reste un choix solide pour créer une dorsale (backend) REST, avec communauté vivante et aidante, une documentation pléthorique, une simplicité d’utilisation et de nombreuses entreprises qui l’utilisent (Github, Airbnb, Twitter, Shopify, Basecamp,...). Comme beaucoup de ses concepts sont repris dans d’autres langages, vous vous sentirez à l’aise si vous devez un jour changer d’environnements.&lt;/p&gt;
&lt;h2&gt;
  
  
  Phoenix, fonctionnel à outrance
&lt;/h2&gt;

&lt;p&gt;Phoenix est le framework web composé en Elixir, qui est un langage dynamique et fonctionnel qui compile votre code en Erlang. Si vous cherchez une solution évolutive et robuste, voilà ce qu’il vous faut. Erlang a été spécialement conçu pour être distribué, insensible aux pannes (Elixir propose des superviseurs qui peuvent démarrer des parties du système) et offrir une haute disponibilité.&lt;/p&gt;

&lt;p&gt;Elixir est un langage fonctionnel. Cela signifie entre autres que les variables sont immutables, qu’il n’y a pas de notion “d’orienté objet” et que les itérations sont opérées par récursions. Mais le langage offre des expressions comme le filtrage par motif (pattern matching) ou les garde (guard), qui une fois goûtés, manquent terriblement dans les autres langages de programmations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Exemple de pattern matching
%Page{body: body, title: title, slug: slug} = Page.find("elixir-is-awesome")
title #=&amp;gt; "Elixir is awesome"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Exemple de garde
def publish(%Page{body: body}) when not is_nil(body) do
  # Code that publish page
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;publish(Page.find("elixir-is-awesome"))
#=&amp;gt; fails if page body is nil
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Routes
&lt;/h3&gt;

&lt;p&gt;La configuration de routes est simple et nous retrouvons l’instruction &lt;code&gt;resources&lt;/code&gt; pour générer les routes REST canoniques :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;defmodule MyApiServer.Router do
  use MyApiServer, :router

  pipeline :api do
        plug :accepts, ["json"]
  end

  scope "/api", HelloWeb do
    pipe_through :api
    resources "/pages", PageController, except: [:new, :edit]
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Voici que serait une fonction du contrôleur pour restituer les informations d’une page en fonction du slug (en utilisant le pattern matching) :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;defmodule MyApiServer.PageController do
  use MyApiServer, :controller
  alias MyApiServer.Page

  def show(conn, %{"id" =&amp;gt; slug}) do
    page = Page.find(slug)
    render(conn, "show.json", page: page)
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Vues
&lt;/h3&gt;

&lt;p&gt;Et voici quelle serait le template pour retourner le JSON :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;defmodule MyApiServer.PageView do
  use MyApiServer, :view
  def render("show.json", %{page: page}) do
    %{slug: page.slug, title: page.title}
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Spécificités
&lt;/h3&gt;

&lt;p&gt;Si vous voulez développer une application web réactive sans utiliser utiliser les frameworks en Javascript (React, Vuejs, Angular,...), le framework propose quelque chose de vraiment unique: LiveView. Il permet une communication bidirectionnelle via WebSocket sur des pages HTML traditionnelles. Le cycle de développement est simplifié : un langage, une application. &lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Phoenix et Elixir ont été co-créé par José Valim, qui est un ancien développeur de Ruby on Rails. C’est donc tout normalement que l’on retrouve les principes qui fait le succès de ce framework et du langage Ruby : architecture MVC, conventions au lieu de configurations, productivité et plaisir de coder :-) Mais grâce à Erlang, Phoenix dispose de ses propres avantages : performance, évolutivité et une incroyable stabilité.&lt;/p&gt;

&lt;h2&gt;
  
  
  Laravel, la Renaissance
&lt;/h2&gt;

&lt;p&gt;Au début il y avait le verbe, et le verbe était PHP. Au démarrage du web, le choix des langages de programmation était plutôt mince. Pas tous le monde ne pouvait se permettre d’acquérir une station NeXT (le premier navigateur a été développé en Objective C sur NeXT). Certains se lancèrent avec Perl. Mais très vite un nouveau langage fut développé et fut largement adopté: PHP. Ce fut une période de forte expérimentation qui déboucha sur des applications web bancales et difficilement maintenables, véritables Tours de Babel. Beaucoup de développeurs se brûlèrent les doigts et quittèrent ce langage déçus.&lt;br&gt;
Néanmoins, le développeur Taylor Otwell, fort de ses expériences tirées d’autres langages, présenta en 2011 un nouveau framework (très inspiré de Ruby on Rails) qui apporta espoire à la communauté des artisans de web.&lt;/p&gt;
&lt;h2&gt;
  
  
  Routes
&lt;/h2&gt;

&lt;p&gt;Concernant la définitions de routes, il n’y a pas de fonction pour produire les routes, il faut les coder à la main :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Route::get('pages', 'PagesController@index');
Route::get('pages/{id}', 'PagesController@show');
Route::post('pages', 'PagesController@store');
Route::put('pages/{id}', 'PagesController@update');
Route::delete('pages/{id}', 'PagesController@delete');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Vues
&lt;/h3&gt;

&lt;p&gt;Le rendu en JSON se fait très naturellement :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;return response()-&amp;gt;json([
    'title' =&amp;gt; 'The best REST framework',
    'content' =&amp;gt; 'The best REST framework is the one you use.',
]);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Laravel propose le concept de “Ressource” comme couche de transformation entre le modèle et la réponse en JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;

class Page extends JsonResource
{
    public function toArray($request)
    {
        return [
            'slug' =&amp;gt; $this-&amp;gt;slug,
            'title' =&amp;gt; $this-&amp;gt;title,
            'body' =&amp;gt; $this-&amp;gt;body,
        ];
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La ressource peut être appelée directement dans la route :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use App\Http\Resources\Pase as PageResource;
use App\Page;

Route::get('/pages', function () {
    return PageResource::collection(Page::all());
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Laravel est un framework solide qui vous permet de construire rapidement une API. Largement utilisé, il intègre les bonnes pratiques issues de plusieurs années d’expérience en PHP et, c’est ce qui est important, des autres langages. Par ailleurs, il embarque plusieurs librairies officielle pour faciliter le développement. Comme par exemple &lt;a href="https://laravel.com/docs/8.x/passport"&gt;Passport&lt;/a&gt; pour l’authentification des API, &lt;a href="https://laravel.com/docs/8.x/sanctum"&gt;Sanctum&lt;/a&gt; pour l’authentification des Single Page Application ou &lt;a href="https://laravel.com/docs/8.x/telescope"&gt;Telescope&lt;/a&gt; pour le débugage et le suivi des performance.&lt;/p&gt;

&lt;h1&gt;
  
  
  Django, le framework qui swing
&lt;/h1&gt;

&lt;p&gt;Django est le framework phare du langage Python. La première version sort en 2005, la même année que RoR. Il a été utilisé par de nombreuses startups à succès comme Disqus, Instagram, Youtube,... Mais toutefois, vous ne pourrez pas (ou difficilement) développer une API avec Django. Et oui: Vous serez obligé de passer par un autre framework en complément : le &lt;a href="https://www.django-rest-framework.org/"&gt;Django Rest Framework&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Django offre une architecture Modèle-Vue-Contrôleur sans contrôleur… \o/ Ce qui est une grande source de confusion dans la prise main. Ici, les vues peuvent être considérées comme les contrôleurs et les templates comme les vues. Mais une fois passé cette étape, Django est une framework très productifs, pensé pour les développeurs avec une excellente documentation. Couplé avec Django Rest, vous pouvez très rapidement construire une API web.&lt;/p&gt;

&lt;h2&gt;
  
  
  Serialization
&lt;/h2&gt;

&lt;p&gt;Un des premier élément à définir est le “Serializer” qui permet de représenter un objet ou une liste d’objet en JSON. Ce qui peut être fait rapidement :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class PageSerializer(serializers.ModelSerializer):
    class Meta:
        model = Page
        fields = ['id', 'title', ‘slug’, 'descrition', 'body']
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Routes
&lt;/h2&gt;

&lt;p&gt;La prochaine étape consiste à rédiger les routes (dans un fichier qui se nomme urls.py) qui permettent de lire, écrire, modifier et effacer une ressource (Page):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from pages import views
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;urlpatterns = [
    path('pages/', views.PageList.as_view()),
    path('pages/&amp;lt;int:pk&amp;gt;/', views.PageDetail.as_view()),]

urlpatterns = format_suffix_patterns(urlpatterns)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Vues
&lt;/h3&gt;

&lt;p&gt;Il est possible de produire les vues (contrôleurs) très rapidement en utilisant les vues génériques (qui suivent les bonnes pratiques REST):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from pages.models import Page
from pages.serializers import PageSerializer
from rest_framework import generics


class PageList(generics.ListCreateAPIView):
    queryset = Page.objects.all()
    serializer_class = PageSerializer


class PageDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Page.objects.all()
    serializer_class = PageSerializer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Spécificités
&lt;/h3&gt;

&lt;p&gt;Django Rest Framework génère automatique un outil de navigation de votre API qui vous permet comme développeur de tester votre application: &lt;a href="https://restframework.herokuapp.com/"&gt;https://restframework.herokuapp.com/&lt;/a&gt;. Cela ressemble à Postman mais en plus simple.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Django Rest Framework est à la fois un outil flexible avec lequel vous pourrez produire rapidement des API web avec les fonctionnalités performantes. Les outils de serialization supportent tant les source directement liées à un modèle (ORM) ou des sources plus complexes (non-ORM). La documentation est complète et vous bénéficierez également d’une grande communauté de développeurs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Maintenant, quel framework choisir ?
&lt;/h2&gt;

&lt;p&gt;Tous les frameworks sont de haute qualités et répondront très probablement à vos besoins. Ils bénéficient tous de plusieurs années d'expériences et ont fait leur preuves dans tout type de projets. Ma proposition est de choisir le framework dans la langue de programmation que vous connaissez le mieux. Vous serez directement productif et vous pourrez apprendre rapidement.&lt;/p&gt;

&lt;p&gt;Toutefois certains framework peuvent avoir certains avantages en fonction de ce que vous recherchez.&lt;/p&gt;

&lt;p&gt;Si votre projet réclame performance et stabilité, &lt;em&gt;Phoenix&lt;/em&gt; sera le meilleur. Elle est l'arme secrète de quelques agences web.&lt;/p&gt;

&lt;p&gt;Si vous voulez produire une API et des pages HTML simultanément, &lt;em&gt;Ruby on Rails&lt;/em&gt; sera plus adapté.&lt;/p&gt;

&lt;p&gt;Si vous avez besoin d’une API et d’un outil de gestion de contenu (à la Wordpress), &lt;em&gt;Django Rest Framework&lt;/em&gt; se marie très bien avec &lt;a href="https://wagtail.io/"&gt;Wagtail&lt;/a&gt; qui est un CMS efficace.&lt;/p&gt;

</description>
      <category>rails</category>
      <category>laravel</category>
      <category>elixir</category>
      <category>django</category>
    </item>
  </channel>
</rss>
