@awenn2015
Веб-программист самоучка

Почему не удается получить только что установленные cookie через fetch?

Задача простая, установить при определенном действии (например добавление в корзину) cookie через fetch запрос, хранить собираюсь объект корзины с минимальными данными (id товара, кол-во и стоимость) но столкнулся с проблемой что после отправки запроса cookie встают судя по ответным заголовкам но при последующем fetch запросе на получение куки (работаю через setcookie в php) в ней уже ничего нет, странно получается ведь при тестировании через postman все работает как надо, данные устанавливаю, потом получаю и все есть, а с браузера прям беды какие то, вот код клиента и сервера

const path = SERVER_URL + "/cart/index.php"


    async function setCookieCart() {
      const data = new FormData()

      data.append("id", "296653")
      data.append("price", "24320")
      data.append("price_old", "0")
      data.append("qty", "1")

      const resp = await fetch(
        path,
        {
          method: "POST",
          body: data,
          credentials: "same-origin"
        }
      )

      const json = await resp.json()

      console.log(json);
    }

    async function getCookieCart() {
      const resp = await fetch(path, {method: "GET"})
      const data = await resp.json()

      console.log(data);
    }

    setCookieCart()

    setTimeout(() => {
      getCookieCart()
    }, 5000)


header('Access-Control-Allow-Origin: https://domainname.ru');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Methods: GET, POST');

class CartService {
  public function __construct($data) {
    $this->data = $data;
  }

  public function getCart() {
    $cookie = isset($_COOKIE["COOKIE_NAME"]) ? $_COOKIE["COOKIE_NAME"] : "[]";
    return $cookie;
  }

  public function setCart() {
    $json = json_encode($this->data, JSON_UNESCAPED_UNICODE);
    $parse = explode('.', $_SERVER['HTTP_HOST']);

    if (count($parse) > 2 )
      array_shift($parse);

    $domain = join(".", $parse);

    try {
      setcookie(
        "COOKIE_NAME",
        $json,
        time() + 604800,
        "/cart",
        $domain,
        false,
        true
      );
    } //
    catch (\Throwable $th) {
      throw $th;
    }

    return $json;
  }
}

if ($_SERVER['REQUEST_METHOD'] === 'GET') {
  $service = new CartService($_GET);
  $json = $service->getCart();
  $cart = json_decode($json, true);

  $resp = [
    "status"  => !empty($cart),
    "count"   => count($cart),
    "cart"    => $cart,
  ];

  die(json_encode($resp, JSON_UNESCAPED_UNICODE));
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  $service = new CartService($_POST);
  $result = $service->setCart();

  die($result);
}
  • Вопрос задан
  • 252 просмотра
Решения вопроса 1
@awenn2015 Автор вопроса
Веб-программист самоучка
Спасибо пользователю Lynn «Кофеман» за предложенный вариант (добавить 'credentials: "same-origin" ' в запрос получения), он оказался рабочий, плюс еще поправил путь для setcookie на "/" и все заработало как надо

ИСПРАВЛЕНО:

Для тех кому как и мне нужно хранить одну куку для множества поддоменов поменяйте credentials: "same-origin" на credentials: "include"
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы