☆☆ 新着記事 ☆☆

2020年5月16日土曜日

JavaScriptでapiをFetchしてみる(1)

https://www.youtube.com/watch?v=Oive66jrwBs


◇ Step1 : ローカルのテキストファイルからFetchする

◇ Step2: JSONファイルからFetchする

◇ Step3: APIからFetchする

◇ 参考:最終版全体



*JSONファイルを読み込む為のfetch関数は、httpのやりとりが必要になります。
*この作業はgetElementByIdを使っていて、httpのやりとりが必要になります。
サーバー環境で試験されるか、ローカルであればXAMPなどの仮想サーバー環境を構築しておく必要があります。
https://www.granfairs.com/blog/staff/apache-vhost-2017
自分はXAMPで。 フォルダは
C:\xampp\htdocs
で。



◆  Step1 : ローカルのテキストファイルからFetchする


*fetch()はAPIで、利用するにはサーバー環境が必要です。ローカルPCにjsonファイルを置いて  fetch('users.json')としても機能しません。fetchでresponse.json()関数を呼び出すことで、レスポンスのデータを自動でJavaScriptオブジェクトに変換してくれます。

(基本構文)
fetch('http://example.com/sample.json')
 .then(response => response.json())
 .then(data => console.log(data));

https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch


(ボタンの設置)

   <button id="getText"> Get Text </button>
   <button  id="getUsers"> Get JSON </button>
   <button  id="getPosts"> Get API DATA </button>


(イベント・リスナーの設置)
 <script>
    document.getElementById('getText').addEventListener('click', getText);
    document.getElementById('getUsers').addEventListener('click', getUsers);
    document.getElementById('getPosts').addEventListener('click', getPosts);
    document.getElementById('addPost').addEventListener('submit', addPost);
 </script>

document.getElementById('getText').addEventListener('click', getText);



(スクリプトの作成)
getText : ボタンがクリックされた時に挙動するFunction

*手順1 : Consoleに表示させてイベントリスナーの挙動確認

function getText(){
 console.log(123);
    }


*手順2 : Textファイルから文字をFetchする(プロミスの処理まで)

function getText(){
  fetch('sample.txt')
    .then( function(res){
    console.log(res);
       })
 }

 1)   fetch('  ')
      fetch( )の引数には取得するファイル名、又はURL
      今回はsample.text ファイル

 2) . then( )
     fetch( ) 関数はプロミス(プレースフォルダーのようなもの)を返す。
    このプロミス(レスポンス)をどう処理するかを指定する。
   fetch( ).then() と1行で記述することも可能。
   レスポンスを処理する関数は、function(res) という名前(resはresponseの略)で表現されるのが一般的。

 .then( function(res){
    console.log(res);
       })
  

PromiseのValue(テキスト形式)の取得
 .then( function(res){
    console.log( res.text( ) );
       })


PromiseのValue(json形式)の取得
 .then( function(res){
    console.log( res.json( ) );
       })

*text()やjson()は、レスポンス・オブジェクトをテキスト・オブジェクトやJSONオブジェクトに変更するmixin

PromiseのValue(テキスト形式)のデータ取得
 .then( function(res){
  return res.text() ;
  })
 .then( function(data){
     console.log(data) ;
  })

又は
(Arrow Functionを使った書き方)
   function getText(){
  fetch('sample.txt')
  .then((res) => res.text( ))
  .then((data) => console.log(data))
  }

同じ結果。
(jsonは)
fetch("./sample.json")
.then(function(resp){
return resp.json()})
.then(function(data){
console.log(data)});
又は
fetch("./sample.json")
.then(results => results.json())
.then(console.log);




 3) 上記の結果をHTMLに表示
クリックボタン
   <button id="getText"> Get Text </button>
直下に
<div id="output"></div>

 function getText(){
 fetch('sample.txt')
  .then((res) => res.text())
  .then((data) => {
     document.getElementById('output').innerHTML = data;
 })
 }

 Step2: JSONファイルからFetchする

(イベント・リスナーの設置)
 <script>
    document.getElementById('getText').addEventListener('click', getText);
    document.getElementById('getUsers').addEventListener('click', getUsers);
    document.getElementById('getPosts').addEventListener('click', getPosts);
    document.getElementById('addPost').addEventListener('submit', addPost);
 </script>

 document.getElementById('getUsers').addEventListener('click', getUsers);

*手順 : JSON形式のデータをFetchする(読み込み処理まで)

 function getUsers(){
 fetch('users.json')
  .then((res) => res.json())
  .then((data) => {
    let output = '<h2>Users</h2>';   <!-- 変数 -->
     console.log(data) ;
 })
 }



*手順 : JSON形式のデータをFetchする(読み込み処理まで)

   function getUsers(){
      fetch('users.json')
      .then((res) => res.json())
      .then((data) => {
        let output = '<h2 class="mb-4">Users</h2>';
        data.forEach( function(user){
          output += ` <!-- イテレーション バックチック キーボードでは、Shiftキー + @ ボタン-->
            <ul class="list-group mb-3">
              <li>ID: ${user.id}</li>  <!--変数を使う時には ${} サイン-->
              <li>Name: ${user.name}</li>
              <li>Email: ${user.email}</li>
            </ul>
          `;<!-- バックチックのend-->
        });
        document.getElementById('output').innerHTML = output;
      })
    }
(他のLoopのさせ方)
https://youtu.be/FN_ffvw_ksE?t=690




 Step3: APIからFetchする


  function getPosts(){
      fetch('https://jsonplaceholder.typicode.com/posts')
      .then((res) => res.json())
      .then((data) => {
        let output = '<h2>Posts</h2>';
        data.forEach(function(post){
          output += `
            <div>
              <h3>${post.title}</h3>
              <p>${post.body}</p>
            </div>
          `;
        });

        document.getElementById('output').innerHTML = output;
      })
    }


おまけ: APIを使ってデータをポストする


  <form id="addPost">
    <input type="text" id="title"  placeholder="Title">
     <textarea id="body" placeholder="Body"></textarea>
    <input type="submit" value="Submit">
 </form>

document.getElementById('addPost').addEventListener('submit', addPost);

<script>
   function addPost(e){
      e.preventDefault(); <!--実際にPostしないように-->

      let title = document.getElementById('title').value;
      let body = document.getElementById('body').value;

      fetch('https://jsonplaceholder.typicode.com/posts', {
        method:'POST',
        headers: {
          'Accept': 'application/json, text/plain, */*',
          'Content-type':'application/json'
        },
        body:JSON.stringify({title:title, body:body}) <!-- Stringに
      })
      .then((res) => res.json())
      .then((data) => console.log(data))
    }
</script>



◇ 参考:最終版全体

<html: index.html>

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Fetch API Sandbox</title>
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous">
</head>

<body>
  <div class="container">
    <h1 class="display-4 mb-4">Fetch API Sandbox</h1>
    <div class="d-flex">
      <button class="btn btn-primary mr-4" id="getText">Get Text</button>
      <button class="btn btn-success mr-4" id="getUsers">Get JSON</button>
      <button class="btn btn-warning mr-4" id="getPosts">Get API DATA</button>
    </div>
    <hr>
    <div id="output"></div>
    <form id="addPost">
      <div class="form-group">
        <input type="text" id="title" class="form-control" placeholder="Title">
      </div>
      <div class="form-group">
        <textarea id="body" class="form-control" placeholder="Body"></textarea>
      </div>
      <input type="submit" class="btn btn-secondary" value="Submit">
    </form>
  </div>

  <script>
    document.getElementById('getText').addEventListener('click', getText);
    document.getElementById('getUsers').addEventListener('click', getUsers);
    document.getElementById('getPosts').addEventListener('click', getPosts);
    document.getElementById('addPost').addEventListener('submit', addPost);

    function getText(){
      // fetch('sample.txt')
      // .then(function(res){
      //   return res.text();
      // })
      // .then(function(data){
      //   console.log(data);
      // });
      fetch('sample.txt')
      .then((res) => res.text())
      .then((data) => {
        document.getElementById('output').innerHTML = data;
      })
      .catch((err) => console.log(err)) <!-- errorをコンソール表示 -->
    }

    function getUsers(){
      fetch('users.json')
      .then((res) => res.json())
      .then((data) => {
        let output = '<h2 class="mb-4">Users</h2>';
        data.forEach(function(user){
          output += `
            <ul class="list-group mb-3">
              <li class="list-group-item">ID: ${user.id}</li>
              <li class="list-group-item">Name: ${user.name}</li>
              <li class="list-group-item">Email: ${user.email}</li>
            </ul>
          `;
        });
        document.getElementById('output').innerHTML = output;
      })
    }

    function getPosts(){
      fetch('https://jsonplaceholder.typicode.com/posts')
      .then((res) => res.json())
      .then((data) => {
        let output = '<h2 class="mb-4">Posts</h2>';
        data.forEach(function(post){
          output += `
            <div class="card card-body mb-3">
              <h3>${post.title}</h3>
              <p>${post.body}</p>
            </div>
          `;
        });
        document.getElementById('output').innerHTML = output;
      })
    }
    function addPost(e){
      e.preventDefault();
      let title = document.getElementById('title').value;
      let body = document.getElementById('body').value;
      fetch('https://jsonplaceholder.typicode.com/posts', {
        method:'POST',
        headers: {
          'Accept': 'application/json, text/plain, */*',
          'Content-type':'application/json'
        },
        body:JSON.stringify({title:title, body:body})
      })
      .then((res) => res.json())
      .then((data) => console.log(data))
    }
  </script>
</body>
</html>


<textファイル:sample.text>

I am a sample text file

<JSONファイル:users.json>

[
  {
    "id":1,
    "name":"Rick",
    "email":"rick@gmail.com"
  },
  {
    "id":2,
    "name":"Glenn",
    "email":"glenn@gmail.com"
  },
  {
    "id":3,
    "name":"Negan",
    "email":"negan@gmail.com"
  }
]


さん
https://www.youtube.com/watch?v=Oive66jrwBs

0 件のコメント:

コメントを投稿