REST APIの構築と利用の基本

rest-api

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構築方法を学び、それぞれの特性を理解しながら実装することが重要です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメント一覧 (1件)

コメントする

目次