Почему HTTP-запрос, созданный с помощью JavaScript, возвращает другое значение, чем при прямом удалении URL-адреса через браузер? [Дубликат]

Лямбда-выражения обычно используются для инкапсуляции алгоритмов, чтобы они могли быть переданы другой функции. Тем не менее, можно выполнить лямбда сразу после определения:

[&](){ ...your code... }(); // immediately executed lambda expression

функционально эквивалентен

{ ...your code... } // simple code block

. Это делает лямбда-выражения мощным инструментом для реорганизации сложных функций. Вы начинаете с упаковки раздела кода в лямбда-функции, как показано выше. Затем процесс явной параметризации можно выполнить постепенно с промежуточным тестированием после каждого шага. После полной настройки кодового блока (как показано в результате удаления &), вы можете переместить код во внешнее местоположение и сделать его нормальной функцией.

Аналогичным образом вы можете использовать лямбда-выражения для инициализации переменных на основе результата алгоритма ...

int a = []( int b ){ int r=1; while (b>0) r*=b--; return r; }(5); // 5!

Как способ разбиения вашей логики на программу, вы можете даже счесть полезным передать лямбда-выражение в качестве аргумента другому lambda expression ...

[&]( std::function algorithm ) // wrapper section
   {
   ...your wrapper code...
   algorithm();
   ...your wrapper code...
   }
([&]() // algorithm section
   {
   ...your algorithm code...
   });

Лямбда-выражения также позволяют создавать именованные вложенные функции , что может быть удобным способом избежать дублирования логики. Использование именованных lambdas также имеет тенденцию быть немного легче на глазах (по сравнению с анонимными встроенными лямбдами) при передаче нетривиальной функции в качестве параметра другой функции. Примечание: не забывайте точку с запятой после закрывающей фигурной скобки.

auto algorithm = [&]( double x, double m, double b ) -> double
   {
   return m*x+b;
   };

int a=algorithm(1,2,3), b=algorithm(4,5,6);

Если последующее профилирование показывает значительные служебные издержки инициализации для объекта функции, вы можете переписать это как нормальная функция.

130
задан Khanetor 1 January 2016 в 18:21
поделиться

4 ответа

Fetch не использует cookie по умолчанию. Чтобы включить cookie, сделайте следующее:

fetch(url, {
  credentials: "same-origin"
}).then(...).catch(...);
206
ответ дан Jeremy 16 August 2018 в 10:40
поделиться
  • 1
    то же самое происхождение больше не работает, включите (см. ответ @ Джерри): developers.google.com/web/updates/2015/03/introduction-to-fetch – jpic 7 December 2016 в 01:59
  • 2
    Как получить доступ к файлам cookie – Mahesh Karthu 30 March 2017 в 14:37
  • 3
    @jpic: «include» работает только для запросов с кросс-началом, но не для запросов с одним и тем же источником. Официальные документы: github.com/github/fetch#sending-cookies – HoldOffHunger 29 November 2017 в 18:26
  • 4
    Я полагаю, что same-origin (который делает все еще работает) означает, что больше заголовков будет соблюдаться (файлы cookie и т. Д.), Но ваш код будет иметь ограниченный доступ к ответу. – Coderer 13 December 2017 в 16:51
  • 5
    @JohnBalvinAriasThx. Как я понял позже, наличие файла cookie httponly означает, что оно не читается document.cookie, но все еще доступно для запросов ajax или fetch. – Martin Bajcar 28 May 2018 в 22:01

Только что решили. Всего два f. дней брутфорса

Для меня секрет заключался в следующем:

  1. Я вызвал POST / api / auth и увидел, что файлы cookie успешно получены.
  2. Затем, вызвав GET / api / users / с credentials: 'include' и получив 401 unauth, из-за отсутствия файлов cookie с запросом.

KEY должен установить credentials: 'include' для первого / api / auth call.

2
ответ дан user1671599 16 August 2018 в 10:40
поделиться

В дополнение к ответу @ Khanetor для тех, кто работает с запросами на перекрестный поиск: credentials: 'include'

Пример запроса выборки JSON:

fetch(url, {
  method: 'GET',
  credentials: 'include'
})
  .then((response) => response.json())
  .then((json) => {
    console.log('Gotcha');
  }).catch((err) => {
    console.log(err);
});

https : //developer.mozilla.org/en-US/docs/Web/API/Request/credentials

112
ответ дан zurfyx 16 August 2018 в 10:40
поделиться
  • 1
    как вы устанавливаете cookie? – pomo 30 August 2016 в 17:58
  • 2
    Файл cookie устанавливается с сервера. В моем случае я использовал httponly cookies. – Khanetor 18 November 2016 в 15:25
  • 3
    @Khanetor можно установить файлы cookie с помощью document.cookie по javascript, а затем отправить запрос? – ospider 14 June 2017 в 01:36
  • 4
    Я не уверен. Вы можете попробовать, если это сработает. – Khanetor 14 June 2017 в 10:35
  • 5
    @ospider Вы можете отправить его в заголовке. – 10101010 24 November 2017 в 10:17
0
ответ дан doctorlee 6 September 2018 в 05:06
поделиться
Другие вопросы по тегам:

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