Почтовый запрос Asp.net Core Web Api не работает

У меня была задача создать метод Add, а затем использовать этот метод в качестве конечной точки для вызова API через мое ядро ​​​​ASP.NET. Все работало с пользовательским интерфейсом Swagger, но мне предложили создать свой собственный интерфейс, и я удалил Swagger и удалил все, что связано со Swagger, из конфигурации, и я переписал то, что мне было нужно. Теперь получаю ошибку...

Я ожидал получить результат, но вместо этого получил сообщение об ошибке

это мой контроллер

namespace APIProject.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class TextCalculatorController : ControllerBase
    {
        [HttpPost]
        public string Calculate(string input)
        {
            return new TextCalculator().Add(input);
        }
    }
}

Это вызов API

 document.getElementById("calculator-form").addEventListener("submit", async function (event) {
    event.preventDefault();
    const numbers = event.target.elements.numbers.value;

    try {
        const response = await fetch("http://localhost:44313/api/TextCalculator", {
            method: "POST",
            headers: {
                "Content-Type": "application/json",
            },
            body: JSON.stringify({ numbers: numbers }),
        });

        if (!response.ok) {
            throw new Error(response.statusText);
        }

        const result = await response.text();
        document.getElementById("result").innerHTML = result;
    } catch (error) {
        document.getElementById("result").innerHTML = error.message;
    }
});

Это метод:

public class TextCalculator
{
    public string Add(string numbers)
    {
        if (string.IsNullOrWhiteSpace(numbers))
        {
            return "0";
        }

        string[] numberStrings = numbers.Split(',');
        int[] numbersArray = new int[numberStrings.Length];
        List<int> negativeNumbers = new List<int>();

        for (int i = 0; i < numberStrings.Length; i++)
        {

            if (!int.TryParse(numberStrings[i], out numbersArray[i]))
            {
                throw new InvalidOperationException("Input must contain only digits.");
            }

            if (numbersArray[i] < 0)
            {
                negativeNumbers.Add(numbersArray[i]);
            }

            if (numberStrings[numberStrings.Length - 1].Length == 0)
            {
                throw new InvalidOperationException("Missing number in last position.");
            }
        }

        if (negativeNumbers.Count > 0)
        {
            string negativeNumbersList = string.Join(", ", negativeNumbers);
            throw new InvalidOperationException("Negative numbers not allowed: " + negativeNumbersList);
        }

        int result = 0;
        foreach (int number in numbersArray)
        {
            result += number;
        }

        return result.ToString();
    }
}

Можно ли найти проблему в этом файле json???

{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:10089",
      "sslPort": 44313
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "UI/index.html",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "APIProject": {
      "commandName": "Project",
      "dotnetRunMessages": "true",
      "launchBrowser": true,
      "launchUrl": "UI/index.html",
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

Не могли бы вы поделиться с нами, какую именно ошибку вы получаете? Вы проверили консоль или вошли в браузер?

Md Farid Uddin Kiron 09.02.2023 02:03

Кроме того, не могли бы вы поделиться подробностями TextCalculator().Add(input)?

Md Farid Uddin Kiron 09.02.2023 02:04

Соединение было сброшено. Это ошибка, которую я получаю в браузере.

ManasievaE 09.02.2023 17:02

Я добавил свой метод в вопрос и попробовал ваше решение, но оно не сработало. В любом случае, спасибо за ваше время.

ManasievaE 09.02.2023 17:05

Как ты пытался? Что именно не сработало? Вы получаете какую-либо ошибку в браузере? Не могли бы вы поделиться своим обновленным фрагментом кода? Не сработало означает, что он не попал в ваш контроллер или вы не получили ответа?

Md Farid Uddin Kiron 09.02.2023 17:06

«Не удалось загрузить ресурс: net::ERR_CONNECTION_RESET» — ошибка в браузере. Я не думаю, что проблема заключается в контроллере, потому что, когда у меня был пользовательский интерфейс Swagger, у меня тоже был контроллер, и все работало нормально, но когда я стер Swagger и создал свой собственный пользовательский интерфейс, вместо результата я получаю «не удалось получить»

ManasievaE 09.02.2023 17:10

Вы не отправляете свой запрос из своего внешнего кода соответственно. Как я уже говорил вам ранее, если вы хотите сохранить свой контроллер как есть, измените код пользовательского интерфейса и отправьте запрос в строке запроса, например const response = await fetch("http://localhost:5094/api/TextCalculator?input = " + numbers, и избавьтесь от body: JSON.stringify({ numbers: numbers }),. Но если вы хотите сохранить свой код пользовательского интерфейса как есть, измените код вашего контроллера. . Вы не пытаетесь найти правильное решение.

Md Farid Uddin Kiron 09.02.2023 17:13

Другая проблема может быть в браузере, очистите кеш в настройках браузера. Удалить все файлы cookie по одному.

Md Farid Uddin Kiron 09.02.2023 17:23

Пробовал все. Думаю может проблема не в коде а в соединении или порте

ManasievaE 09.02.2023 18:00

Я почти уверен, что фрагмент кода является файлом, но это другая проблема. Вы пробовали с каким-то другим портом? Было бы здорово, если бы вы включили несколько журналов трассировки из сети с подробностями.

Md Farid Uddin Kiron 10.02.2023 01:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У меня была задача сделать метод Add и затем использовать этот метод как конечная точка для вызова API через мой ASP.NET Core. Все работало с пользовательским интерфейсом Swagger, но я должен был сделать свой собственный интерфейс, и я удалил Swagger и удалил все, что связано с Swagger, из конфигурации и я переписал то, что мне было нужно. Теперь я получаю ошибку

Что ж, ваше получение ошибки от контроллера довольно очевидно и логично, потому что вы отправляете свой запрос, используя тело запроса: в то время как ваш контроллер вообще не знает об этом и ожидает параметр в строке запроса как string input.

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

Если вы хотите изменить Javascript:

В этом случае фрагмент кода вашего контроллера будет одинаковым в то же время, вам потребуется следующая модификация вашей функции запроса на выборку в Javascript:

const numbers = "100";
            const response = await fetch("http://localhost:5094/api/TextCalculator?input = " + numbers, {
                method: "POST",
                headers: {
                    "Content-Type": "application/json",
                },
               
            });
console.info("Rquest Submitted");
            if (!response.ok) {
                throw new Error(response.statusText);
            }

            const result = await response.text();

            console.info(result);
            document.getElementById("result").innerHTML = result;

Примечание. Как вы можете заметить, если вы хотите отправить запрос в соответствии с определением вашего контроллера, вы должны отправить запрос в виде строки запроса, поскольку это api/TextCalculator?input=" + цифры, а тело не требует отправки. больше.

Выход:

Если вы хотите изменить контроллер в соответствии с [FromBody]:

Если вы хотите сохранить свой Javascript неизменным в этом сценарии, вам нужно изменить действие Calculate вашего контроллера таким образом, чтобы он мог принимать запрос [FromBody].

Контроллер:

        [HttpPost]
        public string Calculate([FromBody] FromBodyRequestModel model)
        {
            return new TextCalculator().Add(model.input);
        }

Модель:

 public class FromBodyRequestModel
    {
        public string input { get; set; }
    }

Примечание. Более того, если вы хотите обновить действие контроллера в соответствии с кодом пользовательского интерфейса, вам нужно использовать [FromBody] в параметре действия контроллера и одну дополнительную модель запроса, которая в этом контексте — FromBodyRequestModel.

Выход:

Мистер Кирон, ваш ответ был правильным. После решения моей проблемы (я должен был использовать HTTPS вместо HTTP, поскольку мой порт был портом ssl), я заметил при отладке, что код не использует тело, поэтому я изменил код JS, и все заработало правильно. Большое спасибо.

ManasievaE 15.02.2023 01:07

Большое спасибо за ваш ответ и рад слышать, что ваша проблема была решена.

Md Farid Uddin Kiron 15.02.2023 01:51

Другие вопросы по теме