Метод POST не вызывается после OPTIONS - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь вызвать API из приложения angularjs

var url = "...";
var myObject = {...};
var config = {
    headers : {
        'Content-Type': 'application/json;charset=utf-8;'
    }
};
$http.post(url, myObject, config).then(function(result){...});

Поскольку это запрос из разных источников, он выполняет предварительную проверку, поэтому вызывает метод OPTIONS. Это заголовок запроса:

Host: ...
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0
Accept: */*
Accept-Language: pt-BR
Accept-Encoding: gzip, deflate
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Referer: http://localhost:9000/....
Origin: http://localhost:9000
DNT: 1
Connection: keep-alive

Возвращается как 200 OK, с заголовком ответа:

{
    Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
    Access-Control-Allow-Origin: *
    Cache-Control: no-store, no-cache, must-revalidate
    Content-Length: 0
    Content-Type: text/html; charset=utf-8
    Date: Fri, 01 Nov 2019 14:31:29 GMT
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Pragma: no-cache
    Server: Microsoft-IIS/10.0
    Vary: X-Requested-With
    X-Frame-Options: GOFORIT
    X-Powered-By: Nette Framework, ASP.NET
}

Но впоследствии он не выполняет вызов POST. Я попытался вызвать метод POST напрямую через POSTMAN, и он вернулся нормально. Я что-то упускаю?

РЕДАКТИРОВАТЬ: Вот ошибка консоли:

Possibly unhandled rejection: 
{
    "data":null,
    "status":-1,
    "config":{
        "method":"POST",
        "transformRequest":[null],
        "transformResponse":[null],
        "jsonpCallbackParam":"callback",
        "headers":{
            "Content-Type":"application/json;charset=utf-8;",
            "Accept":"application/json, text/plain, */*"
         },
        "url":"...",
        "data":{...},
        "cached":false
    },
    "statusText":"",
    "xhrStatus":"error"
}

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

добавить дополнительный заголовок к вашему web.config вот так ...

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
  </customHeaders>
</httpProtocol>
1 голос
/ 06 ноября 2019

В запросе OPTIONS установлены следующие заголовки:

Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type

, поэтому он спрашивает, может ли он выполнить запрос POST, включая заголовок "content-type".

Сервер отвечает с помощью:

Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Origin: *

но в нем отсутствует заголовок ответа " Access-Control-Allow-Headers ":

Access-Control-Allow-Headers: content-type

Добавьте это в ответ OPTIONS, и вы должны бытьхорошо.

Возможно, сообщение об ошибке в консоли:

Причина: отсутствует токен 'content-type' в заголовке CORS 'Access-Control-Allow-Headers' из предварительной проверки CORSканал *

, который не требует пояснений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...