REST APIの構築と利用の基本
REST API(Representational State Transfer)は、ウェブサービスの設計において非常に一般的なアーキテクチャです。RESTは、HTTPプロトコルを基盤として、クライアントとサーバーがリソースをやり取りするために使用されます。この記事では、REST APIの基本概念と、その構築および利用の方法を紹介し、主要なプログラミング言語でのサンプルコードを提供します。
目次
基本概念の説明
REST APIは、リソース(データ)をHTTPリクエストメソッド(GET、POST、PUT、DELETE)を通じて操作します。以下のリクエストメソッドが一般的に使用されます:
- GET: リソースを取得
- POST: 新しいリソースを作成
- PUT: 既存リソースを更新
- DELETE: リソースを削除
各言語でのサンプルコード
Python: Flaskを使ったREST API構築
from flask import Flask, jsonify, request
app = Flask(__name__)
# ダミーデータ
posts = [
{'id': 1, 'title': 'Post 1', 'content': 'Content of post 1'},
{'id': 2, 'title': 'Post 2', 'content': 'Content of post 2'}
]
# GETリクエスト: 全ての投稿を取得
@app.route('/posts', methods=['GET'])
def get_posts():
return jsonify(posts)
# POSTリクエスト: 新しい投稿を作成
@app.route('/posts', methods=['POST'])
def create_post():
new_post = request.get_json()
posts.append(new_post)
return jsonify(new_post), 201
# PUTリクエスト: 投稿を更新
@app.route('/posts/<int:id>', methods=['PUT'])
def update_post(id):
update_data = request.get_json()
for post in posts:
if post['id'] == id:
post.update(update_data)
return jsonify(post)
return jsonify({'error': 'Post not found'}), 404
# DELETEリクエスト: 投稿を削除
@app.route('/posts/<int:id>', methods=['DELETE'])
def delete_post(id):
for post in posts:
if post['id'] == id:
posts.remove(post)
return jsonify({'message': 'Post deleted'})
return jsonify({'error': 'Post not found'}), 404
if __name__ == '__main__':
app.run(debug=True)
C#: ASP.NET Coreを使ったREST API構築
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
[ApiController]
[Route("[controller]")]
public class PostsController : ControllerBase
{
private static List<Post> posts = new List<Post> {
new Post { Id = 1, Title = "Post 1", Content = "Content of post 1" },
new Post { Id = 2, Title = "Post 2", Content = "Content of post 2" }
};
[HttpGet]
public IActionResult GetPosts() => Ok(posts);
[HttpPost]
public IActionResult CreatePost([FromBody] Post newPost)
{
posts.Add(newPost);
return CreatedAtAction(nameof(GetPosts), new { id = newPost.Id }, newPost);
}
[HttpPut("{id}")]
public IActionResult UpdatePost(int id, [FromBody] Post updatedPost)
{
var post = posts.Find(p => p.Id == id);
if (post == null) return NotFound();
post.Title = updatedPost.Title;
post.Content = updatedPost.Content;
return NoContent();
}
[HttpDelete("{id}")]
public IActionResult DeletePost(int id)
{
var post = posts.Find(p => p.Id == id);
if (post == null) return NotFound();
posts.Remove(post);
return NoContent();
}
}
public class Post
{
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
}
C++: REST APIリクエスト (CURLを使用)
#include <iostream>
#include <curl/curl.h>
int main() {
CURL* curl;
CURLcode res;
// GETリクエスト
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://localhost:5000/posts");
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
// POSTリクエスト
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://localhost:5000/posts");
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "{\"id\":3,\"title\":\"Post 3\",\"content\":\"Content of post 3\"}");
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
// PUTリクエスト
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://localhost:5000/posts/3");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT");
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "{\"title\":\"Updated Post 3\",\"content\":\"Updated content\"}");
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
// DELETEリクエスト
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://localhost:5000/posts/3");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE");
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
return 0;
}
Java: Spring Bootを使ったREST API構築
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/posts")
public class PostController {
private List<Post> posts = new ArrayList<>();
public PostController() {
posts.add(new Post(1, "Post 1", "Content of post 1"));
posts.add(new Post(2, "Post 2", "Content of post 2"));
}
@GetMapping
public List<Post> getPosts() {
return posts;
}
@PostMapping
public Post createPost(@RequestBody Post post) {
posts.add(post);
return post;
}
@PutMapping("/{id}")
public Post updatePost(@PathVariable int id, @RequestBody Post updatedPost) {
for (Post post : posts) {
if (post.getId() == id) {
post.setTitle(updatedPost.getTitle());
post.setContent(updatedPost.getContent());
return post;
}
}
return null;
}
@DeleteMapping("/{id}")
public String deletePost(@PathVariable int id) {
posts.removeIf(post -> post.getId() == id);
return "Post deleted";
}
}
class Post {
private int id;
private String title;
private String content;
public Post(int id, String title, String content) {
this.id = id;
this.title = title;
this.content = content;
}
// Getters and Setters
}
JavaScript: REST API構築
const express = require('express');
const app = express();
app.use(express.json());
let posts = [
{ id: 1, title: 'Post 1', content: 'Content of post 1' },
{ id: 2, title: 'Post 2', content: 'Content of post 2' }
];
// GETリクエスト
app.get('/posts', (req, res) => {
res.json(posts);
});
// POSTリクエスト
app.post('/posts', (req, res) => {
const newPost = req.body;
posts.push(newPost);
res.status(201).json(newPost);
});
// PUTリクエスト
app.put('/posts/:id', (req, res) => {
const id = parseInt(req.params.id);
const updatedPost = req.body;
const postIndex = posts.findIndex(post => post.id === id);
if (postIndex !== -1) {
posts[postIndex] = { ...posts[postIndex], ...updatedPost };
res.json(posts[postIndex]);
} else {
res.status(404).json({ error: 'Post not found' });
}
});
// DELETEリクエスト
app.delete('/posts/:id', (req, res) => {
const id = parseInt(req.params.id);
posts = posts.filter(post => post.id !== id);
res.json({ message: 'Post deleted' });
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});
JavaScript: クライアントサイド
const axios = require('axios');
// GETリクエスト
axios.get('http://localhost:3000/posts')
.then(response => console.log(response.data))
.catch(error => console.error(error));
// POSTリクエスト
axios.post('http://localhost:3000/posts', {
id: 3,
title: 'Post 3',
content: 'Content of post 3'
})
.then(response => console.log(response.data))
.catch(error => console.error(error));
// PUTリクエスト
axios.put('http://localhost:3000/posts/3', {
title: 'Updated Post 3',
content: 'Updated content'
})
.then(response => console.log(response.data))
.catch(error => console.error(error));
// DELETEリクエスト
axios.delete('http://localhost:3000/posts/3')
.then(response => console.log(response.data))
.catch(error => console.error(error));
まとめ
REST APIは、HTTPメソッドを使用してデータをやり取りする標準的な手法です。GET、POST、PUT、DELETEの基本的なメソッドを用いて、効率的にAPIを構築し、リソースの管理や操作を行います。各プログラミング言語でのAPI構築方法を学び、それぞれの特性を理解しながら実装することが重要です。
コメント
コメント一覧 (1件)
[…] 4-3-2. REST APIの構築と利用 […]