初心者向け　APIの叩き方まとめ

:::note warn
注意：この記事は個人の備忘録です。間違っている情報もあることと思います
間違っている情報があったら、ご指摘いただけると幸いです。
:::

お疲れ様です。steveです。
先日、お世話になっているインターン先で担当させていただいた業務の中でAPIを叩く機会が多くあり、gptも比較的頼るのを少なめに完遂させることができました。その時の備忘録としてこの記事を残させていただきます。

##
**APIを叩くために準備するもの**
・APIKEY
・endPoint(POSTなのかgetなのかチェック！)
・リクエストで送る内容（headerの中身、bodyの中身など）
##

**APIKEYについて**
・大体、APIの名前でネット検索すれば公式っぽいページが見つかるので、そこで取得可能

**endpoint**
・同じAPIでも使用したい機能によってendpointは変わってくる
例えば、その機能を使うときはPOSTで行うのか、GETで行うのかにもよって仕様は変わってくるので適切に使用したい機能にあったendpointを取得しよう。

**リクエストで送る内容**
ここがAPIによって変わってくるのがAPIのややこしいところ。

例えばyoutubeのAPIなら動画を投稿するためのリンク先を取得するためのエンドポイントがあるので、そのリンク先を取得して「動画投稿用の場所」を確保してから実際に動画投稿のリクエストを送ったり、はたまたchatgptなら、プロンプト設計の内容をリクエストに含めないといけなかったり。。。

では、このような具体的に必要なリクエスト内容をどうやって把握すればいいのか、この言葉を胸に刻むようにしている

:::note info
すべての道はドキュメントに通ず
:::


ドキュメントを見るようにしてみよう、ドキュメントを一人で解読できるエンジニアは強い。だいぶ強い（そう幹部の方が言ってた）

試しに今回、chatgptのAPIを叩いたので、GPTのAPIの叩くときのリクエスト文を紹介


```
const headers = {
            'Authorization': 'Bearer ' + apiKey,
            'Content-Type': 'application/json'
          };
          
 const options = {
            'muteHttpExceptions': true,
            'headers': headers,
            'method': 'POST',
            'payload': JSON.stringify({
              'model': model,
              'max_tokens': 2048,
              'temperature': 0.9,
              "messages": [{
                "role": "user",
                "content": [
                  {
                    "type": "text",
                    "text": message
                  },
                  {
                    "type": "image_url",
                    "image_url": {
                      "url": base64ImageUrl
                    }
                  }
                ]
              }]
            })
          };
```
| 1 | 2 | 3 |
|:-:|:-:|:-:|
| key  | value  | 役割  |
| 'Authorization'  | 'Bearer ' + apiKey  | この場所で実際にAPIKEYを送信し、認証する |
|  'Content-Type' | 'application/json'  |  送信するデータがどの形式であるかを通知します。例: application/json なら「JSONデータ」、text/html なら「HTMLドキュメント」。 |
|'muteHttpExceptions'|true|エラーが発生したときに、「エラーですよ」という内容をレスポンスする（true）のか、エラーが起こった以上レスポンスせずに停止するのか
|'headers'|headers = { 'Authorization': 'Bearer ' + apiKey,'Content-Type': 'application/json'};|ここまでの内容をhttpのヘッダーとして格納する
|'method'|POST|エンドポイントで定義したメソッドをかく
|'payload'|あとで解説|HTTPリクエストで送信する データ本体 を指します。リクエストヘッダーやその他のメタ情報を除いた、リクエストの主要な内容（データ部分
|messages|-|ここがプロンプト部分typeによって、複数のcontentを所有しなければならないパターンです。

**messageについて**
・role・・・OpenAI API や他の対話型AIシステムで使用される重要なフィールドで、APIが処理するメッセージの文脈を示す役割を定義
| 1 | 2 |
|:-:|:-:|
|  system |  システムの指示を設定します。AIの振る舞いや会話の方向性を制御する役割 |
|  user |  ユーザーからAIに送信されるメッセージを指定します。 |
| assistant  | AI（アシスタント）がユーザーに返答するメッセージを指定します。  |
| function  |  APIが機能の結果を返すときに使用します。（新しい機能） |

こんな感じに設計
```
[
  { "role": "system", "content": "あなたはデータサイエンスの専門家として振る舞います。" },
  { "role": "user", "content": "線形回帰とは何ですか？" },
  { "role": "assistant", "content": "線形回帰は、データ間の関係を線形モデルで説明する手法です。" }
]


```
そして
```
"content": [
                  {
                    "type": "text",
                    "text": message
                  },
                  {
                    "type": "image_url",
                    "image_url": {
                      "url": base64ImageUrl
```

ここでコンテンツタイプを指定する、複数のコンテンツを入れたい場合はtype別に記述
##
**try関数について**

try の役割
エラーが発生する可能性のあるコードを安全に実行する
・外部APIへのリクエスト（ネットワークエラーの可能性）
・ファイルの読み書き（ファイルが存在しない可能性）
・データベース操作（接続エラーの可能性）

try ブロックに書かれたコードを実行します。
エラーが発生した場合、そのエラーは catch（またはPythonでは except）ブロックで処理されます。

**プログラムの停止を防ぐ**

通常、エラーが発生するとプログラムはその時点で停止します。
しかし、try を使用すると、エラーが発生しても後続の処理を続行できます。
エラーを適切に処理する

発生したエラーを捕捉し、エラーメッセージを記録したり、代替の処理を実行したりできます。

##
**基本的な構造**
1. try-catch 構文 (GAS/JavaScript)
javascript
```
try {
  // エラーが発生する可能性のあるコード
} catch (e) {
  // エラー発生時に実行するコード
}
```


2. try-except 構文 (Python)
python
```
try:
    # エラーが発生する可能性のあるコード
except Exception as e:
    # エラー発生時に実行するコード**
```

##
**HTTPリクエストを送信する関数**
fetchApp(pythonならrequest)

```
 response = requests.post(url, json=payload, headers=headers)
```

```
const response = UrlFetchApp.fetch(url, options)
```
こうやって使うっぽいですね。
この関数を実行すると、レスポンスが返ってくるっぽい。なんてわかりやすいのか
##
**JSON.parse(responseText) とJSON.stringify(responseText)の違い**

```
function handleJSON() {
  const jsonResponse = '{"name": "花子", "age": 30}'; // サーバーからのレスポンス
  const parsedData = JSON.parse(jsonResponse); // 文字列をオブジェクトに変換

  Logger.log(parsedData.name); // "花子"

  const updatedData = { ...parsedData, city: "東京" }; // データを更新
  const updatedJSONString = JSON.stringify(updatedData); // オブジェクトを文字列に変換

  Logger.log(updatedJSONString); // '{"name":"花子","age":30,"city":"東京"}'
}

```

JSON.stringify(updatedData)は、jsonがdict型のそのまま文字列になる。
JSON.parse(jsonResponse)は、オブジェクトとしてそれぞれバリューを取得可能

| 1 | 2 | 3 |
|:-:|:-:|:-:|
|  JavaScript | Python  | 説明  |
| JSON.parse(responseText)  | json.loads(response_text)  |  JSON形式の文字列をオブジェクト（辞書やリスト）に変換する。 |
| JSON.stringify(responseText)  |  json.dumps(response_data) |  オブジェクト（辞書やリスト）をJSON形式の文字列に変換する。 |