Запрос Axios Post возвращает статус 204 «Нет содержимого». Что мне нужно изменить, чтобы получить 201 / сохранить данные?

#typescript #http #.net-core #axios

#typescript #http #.net-core #axios

Вопрос:

При локальной попытке отправить запрос POST с помощью Axios в моем интерфейсном приложении NodeJS на мой локальный сервер .NET Core сервер возвращает 204, а запрос axios возвращает ожидающее обещание. Что мне нужно изменить, чтобы получить статус 201 «Создано» / сохранить запись? Когда я пытаюсь отправить запрос в Postman, он работает отлично, но мое приложение, однако, ведет себя по-другому.

запрос axios:

 export const postStudent = (firstName: string, lastName: string, yearLevel: string) => {
  return axios
    .post(
      `${externalAppURL}/Students/`,
      {
        id: Math.floor(Math.random() * 10000),
        firstName: firstName,
        lastName: lastName,
      }
    )
    .then(function (response: any) {
      console.log(response);
    })
    .catch(function (error: Error) {
      console.log(error);
    });
}
  

Действие контроллера .NET

         // POST: api/Students
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for
        // more details see https://aka.ms/RazorPagesCRUD.
        [HttpPost]
        public async Task<ActionResult<Student>> PostStudent(Student student)
        {
            _context.Students.Add(student);
            await _context.SaveChangesAsync();

          return CreatedAtAction(nameof(GetStudent), new { id = student.Id }, student);
        }
  

Журналы сервера .NET

 info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/1.1 OPTIONS https://localhost:5001/api/api/Students/  
info: Microsoft.AspNetCore.Cors.Infrastructure.CorsService[4]
      CORS policy execution successful.
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished in 2.6859ms 204 
  

Возвращаемое значение Axios post

 Promise {[[PromiseState]]: 'pending', [[PromiseResult]]: undefined}
[[PromiseResult]]:undefined
[[PromiseState]]:'pending'
__proto__:Promise
  

Startup.cs

         public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseCors(
              options => options.WithOrigins("http://localhost:3000").AllowAnyMethod()
            );
            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
  

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

1. Вы проверили, получаете ли вы ожидаемые результаты от сервера при использовании более простого клиента, такого как cURL или postman? 204 в основном означает, что ваше действие контроллера возвращает null.

2. При использовании postman это работает отлично. Он возвращает статус 201 создан вместе с данными из созданного объекта. Если я приму запрос на экспорт postman в качестве запроса NodeJS, это выглядит следующим образом…

3. var request = require("request"); var options = { method: 'POST', url: 'https://localhost:5001/api/Students/', headers: { 'Postman-Token': 'c5787248-7530-404b-8d19-07c18f041eec', 'cache-control': 'no-cache', 'Content-Type': 'application/json' }, body: { id: 1451246426, firstName: 'trewq', lastName: 'dddd' }, json: true }; request(options, function (error, response, body) { if (error) throw new Error(error); console.log(body); });

Ответ №1:

Я заметил вашу консоль из .СЕТЕВОЙ сервер — это ответ на запрос ПАРАМЕТРОВ, а не на ваш запрос POST. И 204 соответствует этому.

Похоже, вы пытаетесь отправить запрос на localhost: 5001 из пользовательского интерфейса, отображаемого с сервера, работающего в другом источнике (например, localhost: 8080). Это вызовет предполетный запрос (с ПАРАМЕТРАМИ метода HTTP), который определяет, должен ли ваш сервер обслуживать это или нет. По соображениям безопасности ошибки отклонения CORS не будут видны в вашем javascript. Вы можете найти более подробную информацию здесь:https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS.

Сказав, что если этот запрос выполняется через браузер, пожалуйста, проверьте журналы консоли браузера — они обычно печатают ошибки CORS.

Если вы хотите преодолеть это, у вас есть несколько вариантов:

  1. Посмотрите, можете ли вы разместить пользовательский интерфейс также с того же сервера, что и серверная часть.
  2. Включите CORS в серверном контроллере и установите правильные заголовки, по крайней мере, для локальных исполнений ( https://learn.microsoft.com/en-us/aspnet/web-api/overview/security/enabling-cross-origin-requests-in-web-api )
  3. Включите прокси-сервер на сервере хостинга пользовательского интерфейса для прокси-запросов (со стороны сервера) к вашему бэкэнду. Таким образом, ваш запрос axios отправляется в тот же источник, что и пользовательский интерфейс.