בfetch התשובה הראשונית רק מכילה קוד מצב וכותרות (שזה ההתחלה של התשובה), לא את גוף התשובה מה שנקרא body/payload שיש את זה גם בבקשה.
זה שני שלבים במציאות כי גוף התשובה יכול להיות גדול/ארוך/אין סופי.
כדי לגשת לתוכן קוראים למתודה text או json שמחזירים גם פרומייז ש"נפתר" בסיום הקבלה והעיבוד, ככה:
await fetch("/index.php?p=get_functions&format=json", {
method: "post",
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
//make sure to serialize your JSON body
body: JSON.stringify({})
}).then(response => response.text()
).then(resText => console.log(resText) );
אגב אם באמת בדוגמה שלך הבקשה מכילה body עם JSON של אובייקט ריק, זה בהחלט מיותר, אפשר להשמיט את השורה הזאת.