• Как правильно в php принять массив из formData js?

    @zkrvndm
    Rise, да, речь про браузер же. OPTIONS запросы делает браузер с целью проверки на соответствие CORS. А ты чего ожидал?
    Написано
  • Как правильно в php принять массив из formData js?

    @zkrvndm
    Rise, убедись сам:
    xhr = new XMLHttpRequest();
    
    xhr.open('POST', 'https://nadim.work/test.php', true);
    
    xhr.setRequestHeader('Content-Type', 'aplication/json');
    
    xhr.onreadystatechange = function() {
    
        if (xhr.readyState === 4) {
    
            if (xhr.status === 200) {
    
                console.log('Ответ сервера:', xhr.responseText);
    
            }
    
        }
    
    }
    
    xhr.send('{}');
    Написано
  • Как правильно в php принять массив из formData js?

    @zkrvndm
    Rise, которая работает только с fetch, ага. Вы что, думайте jQuery.ajax при cache: false зря штамп в адрес добавляет? Нет, эту либу умные люди писали, именно так максимально надежное игнорирование кеша получается.

    Что я неправильно делаю? Все я правильно делаю. Мне доводилось писать приложения которые за секунду шлют тысячи и тысячи запросов и проблема с тормозами из-за OPTIONS запросов это первое с чем я столкнулся и что мне пришлось решать.
    Написано
  • Как правильно в php принять массив из formData js?

    @zkrvndm
    Rise, нет, обрати внимание на черепашку, черепашки не бывает при использовании дискового кеша. Просто поверь на слово, texp/plain оптимальный вариант, особенно когда надо отправить и принять много данных. Когда речь идет о тысячах и тысячах запросов с секунду, каждый лишние 50 мс. на счету. Не наш случай конечно, но тем не менее, на крупных портал это обычная практика так засылать данные на бэкенд.
    Написано
  • Как правильно в php принять массив из formData js?

    @zkrvndm
    Rise, по поводу временных меток ты не прав, это единственный гарантированный способ сделать запрос без кеша, поэтому такой подходи используется широко и везде.
    Написано
  • Как правильно в php принять массив из formData js?

    @zkrvndm
    Rise, вот, смотри: 64ae7aa23f3a5755409028.png

    Я отправил 3 POST запроса на один и тот же адрес и все три раза сначала шел предзапрос OPTIONS - не кешируется там ничего. Вместо того, чтобы вот так вот грузить сервер в 2 раза чаше, проще использовать text/plain! Такой запрос будет идти в 2 раза быстрее, за счет отсутствия предзапроса.
    Написано
  • Как правильно в php принять массив из formData js?

    @zkrvndm
    Rise, не кешируется, если отправляем POST.
    Написано
  • Как правильно в php принять массив из formData js?

    @zkrvndm
    Rise, кешируется, я не спорю, но касается это вроде бы только GET запросов, а при POST запросах кеширование по умолчанию не используется, более того я также указал, что это все касается только запросов на другие домены, при работе со своим сервером никаких предзапросов не будет, но тем не менее я часто на крупных портал вижу, что стандартной практикой считается отсылать JSON в кодировке text/plain - прям очень часто вижу такую практику.

    Также насчет кеша, замечу, что если мы игнорируем кеш при помощи добавления в адрес временной метки, ничего там кешироватся не будет и OPTIOS запросы будут всегда. Это опять же стандартная практика (насчет добавления временной метки для игнорирования кеша). Все же если мы отправляем запрос с данными, нам как правило не нужен ответ из кеша, а нужен актуальный ответ.

    К счастью, в данном вопросе стоит тег PHP поэтому и мой ответ касается исключительно PHP.
    Написано
  • Что делает метод response.formData внутри fetch?

    @zkrvndm Автор вопроса
    Алексей Уколов, для теста сформировал корректрный и валидный документ multipart/form-data:
    await (await fetch('https://nadim.work/form_data_test.php')).formData(); // TypeError: Could not parse content as FormData.

    Но он все равно не парсится. Сам тестовый документ гарантированно валидный, делитель в Content-Type указан:
    HTTP/2 200 OK
    server: nginx-reuseport/1.21.1
    date: Wed, 12 Jul 2023 06:18:06 GMT
    content-type: multipart/form-data; boundary=---------------------------174400413723109252861051417751
    content-length: 412
    x-powered-by: PHP/7.4.33
    x-content-type-options: nosniff
    cache-control: no-store, no-cache, must-revalidate
    X-Firefox-Spdy: h2
    
    -----------------------------174400413723109252861051417751
    Content-Disposition: form-data; name="raz"
    
    Первый
    -----------------------------174400413723109252861051417751
    Content-Disposition: form-data; name="dva"
    
    Второй
    -----------------------------174400413723109252861051417751
    Content-Disposition: form-data; name="tri"
    
    Третий
    -----------------------------174400413723109252861051417751--
    Написано
  • Что делает метод response.formData внутри fetch?

    @zkrvndm Автор вопроса
    Алексей Уколов, подожди. Вот это ключевой момент который меня интересует. Если я руками на стороне сервера сформирую корректный multipart/form-data то этот метод его прочитает?
    Написано
  • Что делает метод response.formData внутри fetch?

    @zkrvndm Автор вопроса
    Rsa97, это метод доступен лишь после завершения запроса. Каким таким образом им можно что-то там перехватить и изменить, если запрос уже завершен?
    Написано
  • Что делает метод response.formData внутри fetch?

    @zkrvndm Автор вопроса
    Алексей Уколов, нет, запрос уходит, если использовать метод .text() вместо .formData() то и ответ получаю.
    Написано
  • Что делает метод response.formData внутри fetch?

    @zkrvndm Автор вопроса
    Мне вообще ничего не говорит толкование в документации. Я по прежнему не понимаю, как эта хрень должна работать и зачем она нужна. Да и вообще, как это возможно html документ из ответа представить в виде FormData? Или я неправильно понимаю и этот метод не для чтения ответа, а для чтения отправляемых данных? Поясните кто-нибудь, плиз.
    Написано
  • Как правильно в php принять массив из formData js?

    @zkrvndm
    Rise, при POST запросах из браузера на сервер бывают 2 типа запросов: простые и сложные.

    Простые запросы это запросы с кодировками:
    1) application/x-www-form-urlencoded
    2) multipart/form-data
    3) text/plain

    Все остальные кодировки делают запрос сложными. При сложных запросах браузер перед отправкой запроса всегда делает так называемый предзапрос, в консоли такие запросы можно увидеть с пометкой OPTION и так уж выходит, если ты пропишешь application/json оно конечно будет работать, но браузер будет вместо одного запроса отправлять 2 запроса: сначала предзапрос (чтобы проверить соответствие CORS) и только потом сам запрос.

    P. S. Это касается только запросов на другие домены, если запрос на свой собственный домен идет, то можешь смело ставить application/json, предзапросов не будет, но если вдруг обработчик у тебя на другом сайте, лучше использовать text/plain - собственно это универсальное решение, проще сразу изначально везде так делать.

    https://learn.javascript.ru/fetch-crossorigin#nepr....
    Написано
  • Promise executor, почему нельзя уловить ошибку внутри executor с помощью try-catch?

    @zkrvndm
    kosuha, тупанул, надо await использовать для промиса, тогда try-catch вполне себе сработает и словит упавший промис.
    Написано
  • Как изменить параметр в about:config через браузерное расширение?

    @zkrvndm Автор вопроса
    Aetae, да не, в плане подготовить UserScript и руками в консоли на странице about:config запустить)
    Написано
  • Как в Firefox открывать стартовую страницу в popup?

    @zkrvndm Автор вопроса
    WbICHA, не нужен электрон мне, да и трудоемко отладку на NodeJS делать, не вижу смысла тратить силы на него, когда абсолютно все необходимое мне есть в Extension API от Firefox. Плюс у меня куча наработок именно под API браузерных расширений, если на NodeJS все это добро переписывать... ууу мне и года не хватит.
    Написано
  • Как выполнить авто установку временного дополнения при запуске Firefox?

    @zkrvndm Автор вопроса
    AUser0, проверил, да, изменения именно в этом архиве подхватываются автоматом. Также обнаружил, что в файле \Data\profile\prefs.js прописаны UUID от моего расширения и их оказывается можно менять)

    Например, вместо некрасивого moz-extension://0d9099c7-5575-4e6e-89fb-deea39744deb я могу выбрать адрес на свое усмотрение, например moz-extension://purchasebot/start.html и затем уже этот фиксированный адрес прописать как домашнюю в портативном фаерфоксе.
    Написано
  • Как выполнить авто установку временного дополнения при запуске Firefox?

    @zkrvndm Автор вопроса
    AUser0, понял) Да, это вариант. Поискал и нашел, что после установки xpi его дубль появляется в папке \Data\profile\extensions. Если я буду редактировать конфиг внутри именно вот этого дубля, то по идее все норм. будет с авто подхватыванием изменений. Спасибо)
    Написано