iT邦幫忙

1

請問 JavaScript 的 fetch()

  • 分享至 

  • xImage

我在閱讀 JavaScript 高級程序設計 (第 4 版),
裡面介紹到用 fetch() 發送 JSON 數據,
書中程式碼如下:

let payload = JSON.stringify(
    {
        foo: 'bar'
    }
);

let jsonHeders = new Headers(
    {
        'Content-Type': 'application/json'
    }
);

fetch(
    '/send-me-json',
    {
        method: 'POST',
        body: payload,
        headers: jsonHeders
    }
);

這個例子我有2個地方不了解:

  1. 他在 url 參數的地方,
    只有寫 '/send-me-json',
    沒有寫附檔名,我查看主控台都是顯示 404 (Not Found),
    必須改成加上副檔名才行 '/send-me-json.php',
    那書中不寫副檔名,是在什麼情況下可以呢?

  2. 我在 send-me-json.php 檔案內,
    要如何用 PHP 接收傳來的數據呢?

謝謝!

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

6
Felix
iT邦研究生 2 級 ‧ 2021-11-15 23:36:28
最佳解答

網址轉換

如果伺服器有開啟網址轉換,就不需要副檔名。
以 Apache 為例,您必須開啟 mod_rewrite 才能使用網址轉換。
您可以參考這篇文章的說明。

對於路徑,書中的 /send-me-json 是資料夾;
對於伺服器,書中的 /send-me-json 可能是指向 /send-me-json/index.php 或其他符合網址轉換條件的檔案。

簡而言之,/send-me-json 是導向至 /send-me-json/index.php 並開啟檔案,/send-me-json.php 則是直接開啟檔案,沒有導向行為。


請求方法

傳送請求,可以在 PHP 使用 $GET$POST 取得傳送的資料。
如果要取得特定的資料,就在後方加上屬性名稱即可:

const form = new FormData();
const init = { method: 'POST', body: form };

form.append('foo', 'bar');
fetch('/send-me-json.php', init)
    .then(response => response.text())
    .then(data => console.log(data)); // Log: 'bar'
<?php
    if (isset($_POST['foo'])) echo $_POST['foo'];
?>

希望這些對您能有幫助。

fillano iT邦超人 1 級 ‧ 2021-11-16 11:36:21 檢舉

fetch的content-typeapplication/json,這樣post時傳送的json在request body,透過$POST可能讀不到。一般是透過:

$bodyStr = file_get_contents('php://input');

讀取的。

samjam iT邦新手 3 級 ‧ 2021-11-16 16:09:07 檢舉

謝謝 Felix 大大的回答,
我的第1個問題經由您的說明已經了解了。
第2個問題用您的寫範例可以運作,
但改成書上的範例後,
發現沒辦法用 $_POST 取得資料。

謝謝 fillano 大大的回答,
後來看了您的說明後,
第2個問題也解決了。

謝謝二位!

我要發表回答

立即登入回答