OJT ~ APIを作ってみよう ~ 

# はじめに
APIを作ってみましょう！

APIの使い方は[こちら](https://qiita.com/SatoshiGachiFujimoto/items/d5838af7872721c23b89)

# AWS Lambda でシンプルなAPIを作成

## Lambda 関数の作成

1．AWS Lambdaコンソールで新しい関数を作成します
2．関数名を入力し、ランタイムとしてPython 3.13を選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/ae38ae0e-4127-4f2f-bb7f-24ea64eff3a3.png)

3．以下のコードを実装します：

~~~py
import json

def lambda_handler(event, context):
    # HTTPメソッドを取得
    http_method = event['requestContext']['http']['method']
    
    if http_method == 'GET':
        # クエリパラメータから名前を取得
        query_parameters = event.get('queryStringParameters', {})
        name = query_parameters.get('name') if query_parameters else None
        
        if name:
            # 名前がクエリパラメータにある場合
            return {
                'statusCode': 200,
                'body': json.dumps({
                    'message': f'こんにちは、{name}さん！'
                }, ensure_ascii=False)
            }
        else:
            # 名前がない場合（通常の挨拶）
            return {
                'statusCode': 200,
                'body': json.dumps({
                    'message': 'こんにちは！'
                }, ensure_ascii=False)
            }
    
    elif http_method == 'POST':
        # POSTリクエストの処理
        try:
            # リクエストボディからデータを取得
            body = json.loads(event['body'])
            name = body.get('name', '名無し')
            
            return {
                'statusCode': 200,
                'body': json.dumps({
                    'message': f'こんにちは、{name}さん！'
                }, ensure_ascii=False)
            }
        except:
            return {
                'statusCode': 400,
                'body': json.dumps({
                    'message': 'リクエストボディが不正です'
                }, ensure_ascii=False)
            }
    
    else:
        # サポートしていないHTTPメソッド
        return {
            'statusCode': 405,
            'body': json.dumps({
                'message': 'メソッドはGETまたはPOSTのみサポートしています'
            }, ensure_ascii=False)
        }
~~~

## テスト実行
1．テストイベントを作成し、以下のJSONを入力します：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/124f6ee4-6a13-41b3-8bbd-7f70a82b53dc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/b6a537b2-d692-4b68-bf98-d74eb4ab67d8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/3239c54f-adc1-4055-998f-968d0850b7e3.png)

~~~json
{
  "requestContext": {
    "http": {
      "method": "GET"
    }
  },
  "queryStringParameters": {
    "name": "Satoshi"
  }
}
~~~

2．テストを実行して、正しくレスポンスが返ることを確認します

## 関数URLの設定
1．関数URLを作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/e80256b4-f2a7-401c-8f24-78ab768cf9c4.png)

2．認証タイプは「NONE」を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/dbace484-2d51-48b3-bd25-5650ed7334a8.png)

3．作成された関数URLをコピーします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/b8e6d37e-280f-4bae-9cf7-212a18852e8f.png)

## APIの動作確認
### ブラウザでの確認
1．関数URLに直接アクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/b168504b-0f6d-41bd-99a6-ccb5e8f6e8fa.png)

2．クエリパラメータを付けてアクセス（例：?name=Satoshi）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/e1b19742-5ddb-4e4f-94f1-8b07f4dc3f7e.png)


## Pythonから実行

### GETリクエスト

~~~py
import requests


def get_message(name=None):
    # APIのURL
    url = "https://ddorzwnxzqjveigdy6trzz7r5m0ooacy.lambda-url.ap-northeast-1.on.aws/"

    # クエリパラメータの設定
    params = {}
    if name:
        params["name"] = name

    try:
        # GETリクエストを送信（クエリパラメータ付き）
        response = requests.get(url, params=params)

        # レスポンスが正常（200）の場合
        if response.status_code == 200:
            # JSONレスポンスを取得
            data = response.json()
            print(f"受信したメッセージ: {data['message']}")
        else:
            print(f"エラー: ステータスコード {response.status_code}")

    except requests.exceptions.RequestException as e:
        print(f"リクエスト中にエラーが発生しました: {e}")


if __name__ == "__main__":
    # nameパラメータを指定して呼び出す例
    name = input("あなたの名前を入力してください: ")
    get_message(name)
~~~

### POSTリクエスト

~~~py
import requests


def post_message(name=None):
    # APIのURL
    url = "https://ddorzwnxzqjveigdy6trzz7r5m0ooacy.lambda-url.ap-northeast-1.on.aws/"

    # POSTリクエストのJSONボディ
    data = {"name": name}
    try:
        # POSTリクエストを送信
        response = requests.post(url, json=data)

        # レスポンスが正常（200）の場合
        if response.status_code == 200:
            # JSONレスポンスを取得
            result = response.json()
            print(f"受信したメッセージ: {result['message']}")
        else:
            print(f"エラー: ステータスコード {response.status_code}")

    except requests.exceptions.RequestException as e:
        print(f"リクエスト中にエラーが発生しました: {e}")


if __name__ == "__main__":
    # nameパラメータを指定して呼び出す例
    name = input("あなたの名前を入力してください: ")
    post_message(name)
~~~

# まとめ
AWS Lambdaを使用して、シンプルな挨拶を返すAPIを作成しました。GETとPOSTの両方のHTTPメソッドに対応し、名前をパラメータとして受け取ることができます。このAPIは関数URLを通じて直接アクセス可能で、ブラウザやPythonプログラムから簡単に利用できます。