非専門家コード16週間REST APIを学ぶ


REST API


REST(Representation State Transfer)APIとは、RESTアーキテクチャの制約条件を遵守するアプリケーションプログラミングインターフェースを指す.

REST APIの構成


REST APIは、リソース、動作、および表現の3つの要素から構成される.RESTは独自の表現構造からなり,REST APIのみでHTTPリクエストの内容を理解できる.

REST API設計原則


  • URIはリソースを表す必要があります.
  • URIは、リソースを表すことに重点を置くべきである.
  • リソースの名前を識別するには、動詞ではなく名詞を使用します.
  • 名にgetなどの動作の表現を含めることはできません.
  • # bad
    GET /getTodos/1
    GET /todos/show/1
    
    # good
    GET /todos/1

  • リソースの動作はHTTPリクエストメソッドで表される.
  • HTTP要求方法では、クライアントが要求のタイプと目的(リソースの動作)をサーバに通知することができる.
  • は、主に5つの要求方法(GET、POST、PUT、PATCH、DELETEなど)を用いてCRUDを実現する.
  • HTTP要求方法
  • リソースの動作は、URIではなくHTTP要求方法によって表される.
  • リソース取得時にGET、削除時にDELETEで明示する.
  • # bad
    GET /todos/delete/1
    
    # good
    DELETE /todos/1

    💡 JSON Serverの例


    GETリクエスト

  • todoリソースからすべてのtodo(index)を取得します.
  • <!DOCTYPE html>
    <html>
    <body>
    	<pre></pre>
    	<script>
    	// XMLHttpReauest 객체 생성
    	const xhr = new XMLHttpRequest();
    
    	// HTTP 요청 초기화
    	// todos 리소스에서 모든 todo를 취득(index)
    	xhr.open('GET', '/todos');
    
    	// HTTP 요청 전송
    	xhr.send();
    
    	// load 이벤트는 요청이 성공적으로 완료된 경우에 발생
    	xhr.onload = () => {
    	if (xhr.status === 200) {
    	  document.querySelector('pre').textContent = xhr.response;
    	  } else {
    	  console.error('Error', xhr.status, xhr.statusText);
    	  }
    	};
    	</script>
    </body>
    </html>
  • todoリソースでは、idを使用して特定のtodoを取得(取得)する.
  • <!DOCTYPE html>
    <html>
    <body>
    	<pre></pre>
    	<script>
    		// XMLHttpRequest 객체 생성
    		const xhr = new XMLHttpRequest();
    
    		// HTTP 요청 초기화
    		// todos 리소스에서 id를 사용하여 특정 todo를 취득(retrieve)
    		xhr.open('GET', '/todos/1');
    
    		// HTTP 요청 전송
    		xhr.send();
    
    		// load 이벤트는 요청이 성공적으로 완료된 경우 발생
    		xhr.onload = () => {
    		// status 프로퍼티 값이 200이면 정상적으로 응답된 상태.
    		if(xhr.status === 200) {
    		  document.querySelector('pre').textContent = xhr.response;
    		  } else {
    		  console.error('Error', xhr.status, xhr.statusText);
    		  }
    		};
    	</script>
    </body>
    </html>

    POSTリクエスト

  • todoリソースに新しいtodoを作成します.
  • POSTリクエストの場合、setRequestHeaderメソッドを使用して、リクエスト本体をロードしてサーバに送信するペイロードのMIMEタイプを指定する必要があります.
  • <!DOCTYPE html>
    <html>
    <body>
    	<pre></pre>
    	<script>
    		// XMLHttpRequest 객체 생성
    		const xhr = new XMLHttpRequest();
    
    		// HTTP 요청 초기화
    		// todos 리소스에 새로운 todo를 생성
    		xhr.open('POST', '/todos');
    
    		// 요청 몸체에 담아 서버로 전송할 페이로드의 MIME 타입을 지정
    		xhr.setRequestHeader('content-type', 'application/json');
    
    		// HTTP 요청 전송
    		// 새로운 todo를 생성하기 위해 페이로드를 서버에 전송해야 한다.
    		xhr.send(JSON.stringfy({ id: 4, content: 'Angular', completed: false }));
    
    		// load 이벤트는 요청이 성공적으로 완료된 경우 발생
    		xhr.onload = () => {
    		// status 프로퍼티 값이 200(OK) 또는 201(Created)이면 정상적으로 응답된 상태
    		if(xhr.status === 200 || xhr.status === 201) {
    		  document.querySelector('pre').textContent = xhr.response;
    		  } else {
    		  console.error('Error', xhr.status, xhr.statusText);
    		  }
    		};
    	</script>
    </body>
    </html>

    PUT要求

  • PUTは、特定のリソース
  • 全体を置換するために使用される.
  • todosリソースでidを使用するtodoを指定することで、id以外のすべてのリソース
  • を置き換える.
  • PUTリクエストの場合、setRequestHeaderメソッドを使用して、リクエスト本体をロードしてサーバに送信するペイロードのMIMEタイプを指定する必要があります.
  • <!DOCTYPE html>
    <html>
    <body>
    	<pre></pre>
    	<script>
    		// XMLHttpRequest 객체 생성
    		const xhr = new XMLHttpRequest();
    
    		// HTTP 요청 초기화
    		// todos 리소스에서 id로 todo를 특정하여 id를 제외한 리소스 전체를 교체
    		xhr.open('PUT', '/todos/4');
    
    		// 요청 몸체에 담아 서버로 전송할 페이로드의 MIME 타입을 지정
    		xhr.setRequestHeader('content-type', 'application/json');
    
    		// HTTP 요청 전송
    		// 리소스 전체를 교체하기 위해 페이로드를 서버에 전송해야 한다.
    		xhr.send(JSON.stringfy({ id: 4, content: 'React', completed: true }));
    
    		// load 이벤트는 요청이 성공적으로 완료된 경우 발생
    		xhr.onload = () => {
    		// status 프로퍼티 값이 200이면 정상적으로 응답된 상태
    		if(xhr.status === 200) {
    		  document.querySelector('pre').textContent = xhr.response;
    		  } else {
    		  console.error('Error', xhr.status, xhr.statusText);
    		  }
    		};
    	</script>
    </body>
    </html>

    要求PATCH

  • PATCHは、特定のリソースを変更するために使用されます.
  • todoリソースのidを使用してtodoを指定し、変更のみが完了します.
  • PATCHリクエストの場合、setRequestHeaderメソッドを使用して、リクエスト本体をロードしてサーバに送信するペイロードのMIMEタイプを指定する必要があります.
  • <!DOCTYPE html>
    <html>
    <body>
    	<pre></pre>
    	<script>
    		// XMLHttpRequest 객체 생성
    		const xhr = new XMLHttpRequest();
    
    		// HTTP 요청 초기화
    		// todos 리소스의 id로 todo를 특정하여 completed만 수정
    		xhr.open('PATCH', '/todos/4');
    
    		// 요청 몸체에 담아 서버로 전송할 페이로드의 MIME 타입을 지정
    		xhr.setRequestHeader('content-type', 'application/json');
    
    		// HTTP 요청 전송
    		// 리소스 수정하기 위해 페이로드를 서버에 전송해야 한다.
    		xhr.send(JSON.stringfy({ completed: false }));
    
    		// load 이벤트는 요청이 성공적으로 완료된 경우 발생
    		xhr.onload = () => {
    		// status 프로퍼티 값이 200이면 정상적으로 응답된 상태
    		if(xhr.status === 200) {
    		  document.querySelector('pre').textContent = xhr.response;
    		  } else {
    		  console.error('Error', xhr.status, xhr.statusText);
    		  }
    		};
    	</script>
    </body>
    </html>

    DELETEリクエスト


    idを使用して
  • todoリソースから
  • を削除する.
    <!DOCTYPE html>
    <html>
    <body>
    	<pre></pre>
    	<script>
    		// XMLHttpRequest 객체 생성
    		const xhr = new XMLHttpRequest();
    
    		// HTTP 요청 초기화
    		// todos 리소스의 id를 사용하여 todo를 삭제한다.
    		xhr.open('DELETE', '/todos/4');
    
    		// HTTP 요청 전송
    		xhr.send();
    
    		// load 이벤트는 요청이 성공적으로 완료된 경우 발생
    		xhr.onload = () => {
    		// status 프로퍼티 값이 200이면 정상적으로 응답된 상태
    		if(xhr.status === 200) {
    		  document.querySelector('pre').textContent = xhr.response;
    		  } else {
    		  console.error('Error', xhr.status, xhr.statusText);
    		  }
    		};
    	</script>
    </body>
    </html>
    モダンJavaScript Deep Diveの内容を参考にしました