Вызов Fetch не отправляет "no-cors" и работает только тогда, когда файл поврежден - PullRequest
0 голосов
/ 25 октября 2019

У меня есть бэкэнд, разработанный в netuno с API в Java, и я хочу отправить PDF, у меня нет ошибок при отправке Excel, но по какой-то причине я не получаю его с PDF,мой внешний интерфейс - «реаги» и «редукс».

При тестировании в почтальоне работает pdf (и да, я знаю, что в почтальоне нет проблем cors), в браузере, если я отправляю поврежденный pdf, он отправляетсяна веб-интерфейс, но если PDF имеет правильные данные, он больше не передает в Cors.

Я уже установил параметры на стороне сервера для получения правильных заголовков

_header.response.set('Access-Control-Allow-Origin', '*')
_header.response.set('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE, OPTIONS')
_header.response.set('Access-Control-Allow-Headers', 'Content-Type, Expires, Cache-Control, must-revalidate, post-check=0, pre-check=0, Pragma')
_header.response.set('Access-Control-Allow-Credentials', 'true')

Что касается Java, PDF идет со следующими заголовками

   HttpServletResponse res = proteu.getServletResponse();
    res.setHeader("Expires", "0");
    res.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
    res.setHeader("Pragma", "public");

    res.setContentType("application/pdf");

    res.setContentLength(baos.size());

    OutputStream out = res.getOutputStream();
    baos.writeTo(out);
    out.flush();
    out.close();

Мой вызов извлечения похож на это прямо сейчас:

import fetch from "cross-fetch";
const FileSaver = require("file-saver");
const qs = require("qs");

fetch("myEndPoint", {
  headers: {
    accept: "application/pdf",
    "content-type": "application/x-www-form-urlencoded"
  },
  referrerPolicy: "no-referrer-when-downgrade",
  method: "POST",
  mode: "no-cors",
  body: qs.stringify({
    ...action.value
  })
})
  .then(resp => resp.blob())
  .then(blob =>
    FileSaver.saveAs(
      blob,
      "myPdf" +
        new Date(Date.now())
          .toLocaleString()
          .replace(new RegExp("/", "g"), "")
          .split(",")[0] +
        ".pdf"
    )
  );

когда я выполняю код в браузере, этотак оно и есть:

fetch("myEndPoint", {
  credentials: "omit",
  headers: { accept: "application/pdf", "content-type": "application/x-www-form-urlencoded", "sec-fetch-mode": "cors" },
  referrer: "http://localhost:3000/foo",
  referrerPolicy: "no-referrer-when-downgrade",
  body:
    "myData=foo",
  method: "POST",
  mode: "cors"
});

И я получаю следующий код ошибки:

Access to fetch at 'myEndPoint' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

, что странно, учитывая, что все остальные вызовы работают, кроме этого, и единственная разница заключается втип документа, который я получаю.

Я хаНа стороне сервера нет ошибок.

Почему Chrome редактирует mode: "no-cors" для "mode: "cors" ??

, если я пытаюсь использовать "sec-fetch-mode: no-cors"в заголовке вызова извлечения Chrome отвечает:

Refused to set unsafe header "sec-fetch-mode"
...