API


Posted by ericcch24 on 2020-10-16

  • 簡單串接 HTTP API
    ```javascript=
    const request = require('request');
    const process = require('process')

//從 https://reqres.in/ 找測試用的 API 素材,發 request 到網址,API 會回傳資料
//如果只有 request 就都是預設方法是 get,所以也可以 request.get(....)
request('https://reqres.in/api/users/' + process.argv[2], function (error, response, body) {
//console.error('error:', error);
//console.log('statusCode:', response && response.statusCode);
console.log(body);
});

// https://github.com/request/request 可以查詢 request API 用法
// post 的請求,輸入 user 資料
request.post(
{
url:'https://reqres.in/api/users',
form: {
name: 'eric',
job: 'none'
}
},
function (error, response, body) {
//console.error('error:', error);
//console.log('statusCode:', response && response.statusCode);
console.log(body);
}
);

----
### Race Condition
```javascript=
for(let i=1; i<=5; i++) {
  request('https://example.com/api/messages/'+ i, (err, res, body) => {
    console.log(`第${i}個留言`, body);
  })
}

這是拿第一篇到第五篇文章的內容的 API,請問最後 log 出來的結果會是什麼?

12345 嗎?

不是,結果是不一定。

有可能是 12345,也有可能是 54321,甚至是 13542,每一種排列組合都有可能。

原因是:「從你電腦發 Request 到 Server 的時間」跟「Server 的處理時間」以及「從 Server 發 Response 傳到你電腦的時間」這三者都是「無法估計」的。

所以如果我拿出下面這段程式碼:

const request = require('request');

// 新增留言
request.post({
  url: 'https://example.com/api/messages',
  form: { content: '新留言' }
}, (err, res) => {
  console.log('新增成功!');
})

// 抓取所有留言
request('https://example.com/api/messages', (err, res, body) => {
  console.log('所有留言:', body)
})

問你說結果會是什麼,答案是:「不知道」。

這種情況就叫做 race condition,最後的產出完全憑當下他們競爭的結果,你在事前無法預料結果是什麼。你有可能先新增留言,也有可能先拿到結果,每一種都有可能,所以結果變得無法預期。

所以這種情況當然要避免。

那怎麼避免?最好的方法當然就是:「確保第一個 request 處理完成時,我才發送第二個 request」。

那我怎樣才知道第一個處理完了?當然就是從我拿到第一個的 response 的時候,我自然就知道第一個處理完了,不然我不可能拿得到 response 嘛。

所以呢,你要這樣寫才是對的,確保新增留言成功,再去抓取留言:

const request = require('request');

// 新增留言
request.post({
  url: 'https://example.com/api/messages',
  form: { title: '新留言' }
}, (err, res) => {
  console.log('新增成功!');

  // 確保新增成功,才去抓取所有留言
  request('https://example.com/api/messages', (err, res, body) => {
    console.log('所有留言:', body)
  })
})

這樣是唯一能保證順序的方法。牽扯的網路的東西都是非同步的,而非同步就代表著順序是無法被預知的。你只能靠著自己寫 code 來掌握正確的順序。

tags: Week4

#week4







Related Posts

DJI Tello 的基礎操作與套件

DJI Tello 的基礎操作與套件

ASP.NET Core Web API 入門教學 - 參數化並過濾接受值

ASP.NET Core Web API 入門教學 - 參數化並過濾接受值

解構物件(Destructing an Object)

解構物件(Destructing an Object)


Comments