- 透過 API,可以讓雙方交換資料。
- 假設 A 要跟 B 拿 B 的資料,B 要提供一個自己建立的 API 讓 A 可以透過這個 API 拿到資料,也就是可以讓雙方互相傳遞資料的方式。
參考資料:從拉麵店的販賣機理解什麼是 API
- 簡單串接 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 來掌握正確的順序。