Jak wykonać żądanie HTTP?

Jak wykonać żądanie HTTP?

Wątek przeniesiony 2024-09-10 10:14 z JavaScript przez Riddle.

CA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 60
0

Cześć, próbuję wysłać dane POST w JS ale z jakiegoś powodu moje dane nie są przesyłane.

Mam taki kod JS:

Kopiuj
function post(url, data)
{
  let xhr = new XMLHttpRequest();

  xhr.open('POST', url, true);
  xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8');

  xhr.send(JSON.stringify(data));

  xhr.onload = function()
  {
    console.log(xhr.response);
  }
}


let post_data = {action: 'test'};

post('http://localhost/ajax.php', post_data);

Zawartość ajax.php to:

Kopiuj
<?

echo'Dane:'."\r\n\r\n";
print_r($_POST);

?>

A wynik który otrzymuję:

Kopiuj
Dane:

Array
(
)

Z jakiegoś powodu mój kod nie przesyła argumentów w POST. W jaki sposób mogę naprawić ten problem?

obscurity
  • Rejestracja: dni
  • Ostatnio: dni
2

Przejdź na jakiś kurs z tego tysiąclecia. Operowanie na czystym XMLHttpRequest przez żadnego wrappera to proszenie się o problemy, a od 9 lat mamy znacznie prostsze fetch api: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch

RJ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 480
0

Content-Type chyba header powinien być 🙃

CA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 60
0

Zastosowałem fetch i mój obecny kod to:

Kopiuj
function post(url, post_data)
{

  fetch(url,
  {
    method: "post",
    headers: {"Content-Type": "application/json"},
    body: JSON.stringify(post_data)
    })
    .then(res =>
    {
      console.log(res);
    });
}


let post_data = {action: 'test'};

post('http://localhost/cms/ajax.php', post_data);

Jednak niestety nie otrzymuję żadnego zwrotu wyświetlanego przez ajax. Cały wynik to:

screenshot-20240910100458.png
Natomiast w Propotype -> get body w arguments i caller mam błąd:

Kopiuj
[wyjątek: TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them at Function.invokeGetter (<anonymous>:3:28)]

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
2
Kopiuj
<?php

header('Content-Type: application/json');
echo json_encode([
  'foo' => 'bar'
]);
Kopiuj
fetch(url, {
  method: "POST",
  headers: {"Content-Type": "application/json"},
  body: JSON.stringify(post_data)
})
  .then(response => response.json())
  .then(result => {
    console.log(result);
  });
  • Unikaj zamykającego ?>, to powoduje tylko kłopoty.
  • Staraj się odpowiednio nazywać zmienne, response, result, requestBody, etc.
CA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 60
0

@Riddle Nie wiedziałem, żę "?>" powoduje kłopoty, możesz mi napisać dlaczego i jakie powoduje?

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
2
catshy napisał(a):

@Riddle Nie wiedziałem, żę "?>" powoduje kłopoty, możesz mi napisać dlaczego i jakie powoduje?

Można go pominąć całkowicie, i powinno się to robić.

?> jest równoważne z echo. Tzn zapis ?> welcome to jest to samo co echo ' welcome';. Wszystkie znaki po ?> są po prostu printowane, tak jakbyś je chciał wyświetlić.

Ma to taką wadę, że jak np. miałbyś "?> " (spację) albo "?>\n" (nową linię po nim), to niepotrzebnie wyprintujesz coś na stdOut.

To jest trochę upierdliwe ze każdy plik PHP trzeba zaczynać <?php, no ale co poradzisz 😕

CA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 60
0

Niestety problemów ciąg dalszy, kurczę 😀

Kopiuj
  let post_data = {action: 'test'};

  fetch('http://localhost/ajax.php',
  {
    method: "POST",
    headers: {"Content-Type": "application/json"},
    body: JSON.stringify(post_data)
  })
  .then(response => response.json())
  .then(result => {
    console.log(result);
  });
Kopiuj
<?

$op=fopen('wynik.txt', 'w');
fputs($op, print_r($_POST, true));

I niestety wynik jest pusty :(

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
2

$_POST nie zadziała z JSON.

Masz dwie opcje:

  • Albo skorzystaj z $_POST, ale musisz wysłać dane korzystając z multipart/form-data.
  • Albo wysyłaj nadal jako JSON, ale musisz je samemu odebrać i przeparsować.

Wyjście pierwsze, multipart/form-data:

Kopiuj
const formData  = new FormData();
formData.append('foo', 'bar');

fetch('http://localhost/ajax.php', {
  method: 'POST',
  body: formData
})
  .then(response => response.text())
  .then(result => console.log(result));
Kopiuj
print_r($_POST);

Wyjście drugie, application/json:

Kopiuj
fetch('http://localhost/ajax.php', {
  method: "POST",
  headers: {"Content-Type": "application/json"},
  body: JSON.stringify({foo: 'bar'})
})
.then(response => response.text())
.then(result => console.log(result));
Kopiuj
<?php

$values = json_decode(file_get_contents("php://input"));
print_r($values);

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.