JSでfetchを用いて、POSTで値を受け取りたい

◆やりたいこと
JSでfetchを用いて、POSTで値を受け取りたい

btn.htmlでボタンをクリックしたら、データをrecieve.phpで受け取れるようにしたい。

(本来実施したいことは、自作CMSで投稿記事の並び替えをAjaxで実装したい。
ただ、jQueryに依存せずにfetchを用いて実装したいと思い試したが上手くいかないため、簡易なものを用意して原因を突き止めようとした。

◆発生している問題

btn.htmlではコンソールに値が表示されているが、送信先(recieve.php)では値がnullになる。

◆質問内容
何が原因と思われるか知見を頂きたい。

◆試したこと
btn.htmlでは、responceでstatus200となった後のthen((data)"でコンソールに{hoge:"ほげ"}と表示されているが、受け取りで値が{hoge: null}になるため、受け取りファイルのrecieve.phpが問題と推測。

①$_POST ⇒ file_get_contents("php://input")に変更
調べるとjson形式は$_POSTで受け取れない、とあったため変更したが結果はnull.
念のため下記を確認したがいずれもnull
var_dump(json_decode(file_get_contents("php://input"),true));
var_dump(file_get_contents("php://input"));

②検証ツールでNetworkの内容を確認
POSTでnullなので、networkで何かわからないか確認しようとした。

recive.phpのpreviewタブで下記のように表示されている。
{hoge: {hoge: "ほげ"}}
hoge: {hoge: "ほげ"}
hoge: "ほげ"

responseタブでは下記のような表示
{"hoge":{"hoge":"\u307b\u3052"}}

jsの書き方についても、terataillで同様の事例を確認し、成功したとなっている内容を入れ込み。
new FormDataを用いるやり方も実施したが、同様にnull。

◆フォルダ(同一階層)

・btn.html
・main.js
・recieve.php

◆ファイルの中身
【btn.html】

HTML

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="main.js" defer></script> <style> .btn-wrap { widows: 100%; height: 100vh; display: flex; justify-content: center; align-items: center; } .btn-wrap a { padding: 2rem; background: rgb(0, 110, 255); color: #fff; border-radius: 1rem; text-decoration: none; } </style> </head> <body> <div class="btn-wrap"> <a href="" id="btn">送信</a> </div> </body> </html>

【main.js】

javascript

window.addEventListener("DOMContentLoaded", () => { const btn = document.getElementById("btn"); btn.addEventListener("click", (e) => { e.preventDefault(); let data = {"hoge": "ほげ" }; fetch("recieve.php", { method: "POST", headers: { "Content-Type": "application/json", 'Accept': 'application/json' }, mode:"cors", cache: 'default', body: JSON.stringify(data), }).then(response => { if (response.ok) { return response.json(); } else { throw new Error(`リクエスト失敗: ${response.status} ${response.statusText}`); } }).then((data) => { console.log(data); }).catch((error) => { console.warn(error); }); });});

【recieve.php】

PHP

<?php$my_post = json_decode(file_get_contents("php://input"), true);$data = ["hoge"=>$my_post]; echo json_encode($data);

コメントを投稿

0 コメント