Метод Axios Post return 405 не разрешен на Vue.js

#vue.js #iis #.net-core #axios #asp.net-core-5.0

Вопрос:

Я пытаюсь отправить запрос POST в службу NET CORE 5 (размещенную в IIS 10) из Vue.js приложение с axios.

Когда я тестирую сервис с POSTMAN, он работает отлично, но с Axios я всегда получаю 405 с сервера.

Анализ запросов с помощью fiddler выглядит совсем по-другому. В запросе axios заголовок типа содержимого отсутствует, а метод — OPTIONS вместо POST .

Это запрос POSTMAN:

 POST https://localhost/apiluxor/api/SignIn HTTP/1.1
Content-Type: application/json
User-Agent: PostmanRuntime/7.28.4
Accept: */*
Postman-Token: acfed43c-731b-437b-a88a-e640e8216032
Host: localhost
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 55

{
    "username":"user",
    "password":"testpw"
}
 

И это запрос axios:

 OPTIONS https://localhost/apiluxor/api/SignIn HTTP/1.1
Host: localhost
Connection: keep-alive
Accept: */*
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Origin: http://172.16.1.110:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site
Sec-Fetch-Dest: empty
Referer: http://172.16.1.110:8080/
Accept-Encoding: gzip, deflate, br
Accept-Language: it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7
 

В моем Vue.js модуль Я пытался принудительно изменить настройки «content-type» в основной конфигурации и в post-запросе, но безрезультатно.

 import { App } from "vue";
import axios from "axios";
import VueAxios from "vue-axios";
import JwtService from "@/core/services/JwtService";
import { AxiosResponse, AxiosRequestConfig } from "axios";

class ApiService {
  public static vueInstance: App;
  public static init(app: App<Element>) {
    ApiService.vueInstance = app;
    ApiService.vueInstance.use(VueAxios, axios);
    ApiService.vueInstance.axios.defaults.baseURL =
      "https://localhost/apiluxor/api";
    ApiService.vueInstance.axios.defaults.headers.post["Content-Type"] =
      "application/json";
  }

  public static setHeader(): void {
    ApiService.vueInstance.axios.defaults.headers.common[
      "Authorization"
    ] = `Bearer ${JwtService.getToken()}`;
  }

  public static post(
    resource: string,
    params: AxiosRequestConfig
  ): Promise<AxiosResponse> {
    return ApiService.vueInstance.axios.post(resource, params, {
      headers: { "content-type": "application/json" },
    });
  }

export default ApiService;
 

Я очень новичок в Vue.js так что, может быть, я что-то упускаю.

Ответ №1:

Проблема в том, что axios отправил запрос CORS перед публикацией, и API NET Core должен быть настроен на прием запроса CORS.

Я нашел статью (здесь ), в которой говорится, что проблема в этом случае заключается в том, что IIS не принимает запрос CORS, и модуль CORS должен быть установлен. Я пробовал это изменение, но результатом было то, что я получал HTTP / 1.1 204 без содержимого вместо 403.

В моем случае проблема заключалась в самой службе API.

CORS должен быть включен в службе API. В NET CORE 5 для базовой конфигурации достаточно добавить службы CORS при запуске

 services.AddCors();
 

и настройте его

     app.UseCors(builder =>
    {
        builder
        .AllowAnyOrigin()
        .AllowAnyMethod()
        .AllowAnyHeader();
    });
 

С этими изменениями сервис отлично работает для любого vue.js запросы, поступающие от axios.

Комментарии:

1. Я так рад, что проблема была решена. Очень ценится, если вы можете пометить решение как ответ.

Ответ №2:

Чтобы отправить данные в виде JSON в теле post-запроса, просто добавьте параметр «data» в параметры axios. Axios автоматически установит для content-tpe правильное значение для вас.

 // Simple example
axios.post(myUrl, {
  data: {
    "username":"user",
    "password":"testpw"
  }
});
 

Это должно иметь ожидаемый результат 🙂