<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>devkuma – REST API</title>
    <link>https://www.devkuma.com/jp/tags/rest-api/</link>
    <image>
      <url>https://www.devkuma.com/jp/tags/rest-api/logo/180x180.jpg</url>
      <title>REST API</title>
      <link>https://www.devkuma.com/jp/tags/rest-api/</link>
    </image>
    <description>Recent content in REST API on devkuma</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>jp</language>
    <managingEditor>kc@example.com (kc kim)</managingEditor>
    <webMaster>kc@example.com (kc kim)</webMaster>
    <copyright>The devkuma</copyright>
    
	  <atom:link href="https://www.devkuma.com/jp/tags/rest-api/index.xml" rel="self" type="application/rss+xml" />
    
    
      
        
      
    
    
    <item>
      <title>REST API</title>
      <link>https://www.devkuma.com/jp/docs/rest-api/</link>
      <pubDate>Mon, 25 Dec 2017 19:03:56 +0900</pubDate>
      <author>kc@example.com (kc kim)</author>
      <guid>https://www.devkuma.com/jp/docs/rest-api/</guid>
      <description>
        
        
        &lt;h2 id=&#34;restとは&#34;&gt;RESTとは&lt;/h2&gt;
&lt;p&gt;RESTはRepresentational State Transferの略である。World Wide Webのような分散ハイパーメディアシステム向けのアーキテクチャスタイルであり、Roy Fielding氏が2000年の博士論文で紹介した。RESTの原則に従うシステムはRESTfulと呼ばれる。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.devkuma.com/docs/rest-api/rest-api.png&#34; alt=&#34;REST API&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;restの特徴&#34;&gt;RESTの特徴&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;統一インターフェース&lt;/strong&gt;: URIで識別したリソースを、一貫した限定的なインターフェースで操作する。HTTP APIは特定のプラットフォームやプログラミング言語に依存しない。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ステートレス&lt;/strong&gt;: 各リクエストには処理に必要な情報を含める。サーバーはリクエスト間でクライアントのセッション状態を保持する必要がない。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;キャッシュ可能&lt;/strong&gt;: RESTはHTTP基盤を利用するため、&lt;code&gt;Last-Modified&lt;/code&gt; や &lt;code&gt;ETag&lt;/code&gt; などのヘッダーによるキャッシュを活用できる。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;クライアント・サーバー構造&lt;/strong&gt;: クライアントとサーバーの役割を分離し、相互依存を減らす。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自己記述的メッセージ&lt;/strong&gt;: リクエストやレスポンスは、処理方法を理解するために必要な情報を含む。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;階層化システム&lt;/strong&gt;: セキュリティ、負荷分散、暗号化、プロキシ、ゲートウェイなどを中間層として追加できる。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コードオンデマンド（任意）&lt;/strong&gt;: JavaScriptなどの実行可能なロジックをサーバーから送信し、クライアントの機能を拡張できる。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;restの構成要素&#34;&gt;RESTの構成要素&lt;/h2&gt;
&lt;h3 id=&#34;リソース&#34;&gt;リソース&lt;/h3&gt;
&lt;p&gt;リソースは、サーバーに保存される識別可能な対象である。クライアントは &lt;code&gt;/groups/{groupId}/users/{userId}&lt;/code&gt; のようなURIを通して状態を取得、変更する。リソース名には通常、&lt;code&gt;users&lt;/code&gt; や &lt;code&gt;groups&lt;/code&gt; のような名詞を使う。&lt;/p&gt;
&lt;h3 id=&#34;メソッド&#34;&gt;メソッド&lt;/h3&gt;
&lt;p&gt;HTTPメソッドは、リソースに対する操作を表す。代表的なメソッドには &lt;code&gt;GET&lt;/code&gt;、&lt;code&gt;POST&lt;/code&gt;、&lt;code&gt;PUT&lt;/code&gt;、&lt;code&gt;DELETE&lt;/code&gt; がある。&lt;/p&gt;
&lt;h3 id=&#34;リプレゼンテーション&#34;&gt;リプレゼンテーション&lt;/h3&gt;
&lt;p&gt;リプレゼンテーションは、レスポンスとして送信されるリソースの表現形式である。1つのリソースをJSON、XML、テキストなどで表現できる。&lt;/p&gt;
&lt;h2 id=&#34;httpメソッド&#34;&gt;HTTPメソッド&lt;/h2&gt;
&lt;p&gt;REST APIでは、一般にHTTPメソッドをCRUD操作へ対応させる。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;HTTPメソッド&lt;/th&gt;
					&lt;th&gt;CRUD&lt;/th&gt;
					&lt;th&gt;コレクションの例 &lt;code&gt;/customers&lt;/code&gt;&lt;/th&gt;
					&lt;th&gt;個別項目の例 &lt;code&gt;/customers/{id}&lt;/code&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;作成&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;201 Created&lt;/code&gt;、通常は &lt;code&gt;Location&lt;/code&gt; ヘッダーを付ける&lt;/td&gt;
					&lt;td&gt;リソースがすでに存在する場合は &lt;code&gt;404 Not Found&lt;/code&gt; または &lt;code&gt;409 Conflict&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;取得&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;200 OK&lt;/code&gt;、必要に応じてページング、ソート、フィルタリングを使う&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;200 OK&lt;/code&gt;、IDが不明なら &lt;code&gt;404 Not Found&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;PUT&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;更新または置換&lt;/td&gt;
					&lt;td&gt;通常は &lt;code&gt;405 Method Not Allowed&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;200 OK&lt;/code&gt; または &lt;code&gt;204 No Content&lt;/code&gt;、不明なIDなら &lt;code&gt;404 Not Found&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;DELETE&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;削除&lt;/td&gt;
					&lt;td&gt;通常は &lt;code&gt;405 Method Not Allowed&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;200 OK&lt;/code&gt;、不明なIDなら &lt;code&gt;404 Not Found&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;リソース命名規則&#34;&gt;リソース命名規則&lt;/h2&gt;
&lt;p&gt;RESTのリソース命名には、2つの基本原則がある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;URIはリソースを表す。&lt;/li&gt;
&lt;li&gt;HTTPメソッドはリソースに対する操作を表す。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;リソースには名詞を使う&#34;&gt;リソースには名詞を使う&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;update&lt;/code&gt; のような操作をURIへ含めない。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GET /users/update/1  (X)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PUT /users/1         (O)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;リソース名は複数形に統一する&#34;&gt;リソース名は複数形に統一する&lt;/h3&gt;
&lt;p&gt;URIパスの各要素には複数形の名詞を使う。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GET /user/329   (X)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GET /users/329  (O)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;ファイル拡張子を含めない&#34;&gt;ファイル拡張子を含めない&lt;/h3&gt;
&lt;p&gt;表現形式の要求には &lt;code&gt;Accept&lt;/code&gt; などのHTTPヘッダーを使う。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GET /users/345/profile.jpg                          (X)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GET /users/345/profile
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Accept: image/jpeg                                  (O)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;スラッシュで階層を表す&#34;&gt;スラッシュで階層を表す&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;/&lt;/code&gt; で階層を表し、末尾のスラッシュは避ける。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/users/{userId}/books/  (X)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/users/{userId}/books   (O)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;リソース間の関係を表す&#34;&gt;リソース間の関係を表す&lt;/h3&gt;
&lt;p&gt;サブリソースを使って関係を表現できる。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/users/{userId}/friends
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/users/{userId}/books
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/users/{userId}/recommendations/books
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;パスには小文字を使う&#34;&gt;パスには小文字を使う&lt;/h3&gt;
&lt;p&gt;URIパスはスキームとホスト以外で大文字と小文字を区別する。小文字に統一すると曖昧さを避けられる。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/Users/{userId}/Books  (X)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/users/{userId}/books  (O)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;httpステータスコード&#34;&gt;HTTPステータスコード&lt;/h2&gt;
&lt;p&gt;適切に設計されたREST APIは、意味のあるHTTPステータスコードを返す。&lt;/p&gt;
&lt;h3 id=&#34;2xx-成功&#34;&gt;2xx 成功&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;コード&lt;/th&gt;
					&lt;th&gt;意味&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;200 OK&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;リクエストを正常に処理した。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;201 Created&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;新しいリソースを正常に作成した。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;204 No Content&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;リクエストは成功し、レスポンス本文は不要である。&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;3xx-リダイレクト&#34;&gt;3xx リダイレクト&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;コード&lt;/th&gt;
					&lt;th&gt;意味&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;304 Not Modified&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;クライアントがキャッシュした版からリソースが変更されていない。&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;4xx-クライアントエラー&#34;&gt;4xx クライアントエラー&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;コード&lt;/th&gt;
					&lt;th&gt;意味&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;400 Bad Request&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;サーバーがリクエスト構文を理解できない。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;401 Unauthorized&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;認証が必要であるか、認証に失敗した。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;403 Forbidden&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;サーバーはリクエストを理解したが、アクセスを拒否する。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;404 Not Found&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;要求したリソースが存在しない。&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;5xx-サーバーエラー&#34;&gt;5xx サーバーエラー&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;コード&lt;/th&gt;
					&lt;th&gt;意味&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;500 Internal Server Error&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;リクエスト処理中にサーバーでエラーが発生した。&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://ja.wikipedia.org/wiki/Representational_State_Transfer&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Wikipedia | REST&lt;i class=&#34;fas fa-external-link-alt&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://ja.wikipedia.org/wiki/HTTP%e3%82%b9%e3%83%86%e3%83%bc%e3%82%bf%e3%82%b9%e3%82%b3%e3%83%bc%e3%83%89&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Wikipedia | HTTPステータスコード&lt;i class=&#34;fas fa-external-link-alt&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.restapitutorial.com/lessons/restfulresourcenaming.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;RESTful Resource Naming&lt;i class=&#34;fas fa-external-link-alt&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
      
      <category>WEB</category>
      
      <category>REST API</category>
      
    </item>
    
  </channel>
</rss>
