ASP. NET Веб-API: «Сообщение»: «Запрашиваемый ресурс не поддерживает http-метод« POST », PUT, DELETE.» в почтальоне - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь создать простой ASP.NET Web API, который получает, публикует, помещает и удаляет записи (pharmacyName, pharmacyAddress, pharmacyCategory) в MySQL базе данных. Обе мои функции "GET" успешно выполняются, но когда я проверяю функциональность POST, PUT или DELETE в Postman, я получаю следующую ошибку:

"Сообщение": "Запрошенный ресурс не поддерживает http-метод «POST». "

Я искал решения на форумах и в Интернете, но мне не удалось найти ответ, относящийся к моему делу. Я новичок, поэтому, пожалуйста, прости меня, если я что-то пропустил или использовал неправильную / запутанную терминологию или структуру кодирования.

URL-адрес запроса, который я использую в Почтальоне, - "localhost:59353/api/values/. Ниже приведены блоки кода из моих ValuesController.cs, RouteConfig.cs, and WebAPIConfig.cs файлов:

ValuesController.cs Метод POST:

// POST api/values
[System.Web.Http.HttpPost]
public void Post([FromBody]string pharmacyName, string pharmacyAddress, string pharmacyCategory)
{

    MySqlConnection conn = WebApiConfig.conn();

    MySqlCommand query = conn.CreateCommand();

    query.CommandText = "INSERT INTO locations (pharmacyName, pharmacyAddress, pharmacyCategory) VALUES (@pharmacyName, @pharmacyAddress, @pharmacyCategory)";

    query.Parameters.AddWithValue("@pharmacyName", pharmacyName);
    query.Parameters.AddWithValue("@pharmacyAddress", pharmacyAddress);
    query.Parameters.AddWithValue("@pharmacyCategory", pharmacyCategory);


    var results = new List<results>();

    try
    {
        conn.Open();
    }

    catch (MySql.Data.MySqlClient.MySqlException ex)
    {
        results.Add(new results(null, null, null, ex.ToString()));
    }

    MySqlDataReader fetch_query = query.ExecuteReader();

    while (fetch_query.Read())
    {
        results.Add(new results(fetch_query["pharmacyName"].ToString(), fetch_query["pharmacyAddress"].ToString(), fetch_query["pharmacyCategory"].ToString(), null));
    }


}

RouteConfig.cs:

public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }

WebAPIConfig.cs:

public static class WebApiConfig
    {
        public static MySqlConnection conn()
        {
            string conn_string = "server=localhost;port=3306;database=map;username=root;password=123456";

            MySqlConnection conn = new MySqlConnection(conn_string);

            return conn;
        }
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }

1 Ответ

1 голос
/ 26 февраля 2020

Простые типы, такие как string, int, float et c, должны выбираться из строки запроса в. Net framework, где сложные типы всегда выбираются из тела.

Решение -1

В этом случае. Net Framework ожидает строку pharmacyAddress и pharmacyCategory из параметров запроса, и вы можете вызывать свой API таким образом, не внося никаких изменений в ваш код на стороне сервера.

Примечание: Также вам не нужно определять ключ параметра (в запросе http), который определяется как [From Body]. Как только один простой тип может быть передан с использованием [FromBody] атрибута , который вы можете увидеть ниже, как это =pharmacyNameContent

POST /api/values?pharmacyAddress=myaddress&pharmacyCategory=mycategory HTTP/1.1
Host: localhost:59353
Content-Type: application/x-www-form-urlencoded
=pharmacyNameContent

Solution-2

Или вы можете позвонить своему API, помещая все ваши параметры в сложную модель и передавая параметры через тело вместо параметров запроса, подобных этому

Модель сложного типа

public class PharmacyModel
    {
        public string PharmacyName { get; set; }
        public string PharmacyAddress { get; set; }
        public string PharmacyCategory { get; set; }
    }

Код API

[System.Web.Http.HttpPost]
public void Post(PharmacyModel pharamcyModel)
{
    MySqlConnection conn = WebApiConfig.conn();
    MySqlCommand query = conn.CreateCommand();

    //Access your propeties like this
    query.CommandText = "INSERT INTO locations (pharamcyModel.PharmacyName, pharamcyModel.PharmacyAddress, pharamcyModel.PharmacyCategory) VALUES (@pharmacyName, @pharmacyAddress, @pharmacyCategory)";

  //rest of the coding
}

И теперь вы можете использовать свой API, передавая параметры через тело следующим образом:

POST /api/values? HTTP/1.1
Host: localhost:59353
Content-Type: application/x-www-form-urlencoded

pharmacyAddress=myaddress&pharmacyCategory=mycategory&pharmacyName=nameOfPharmacy

Он наверняка будет работать так, как уже реализован и протестирован с моей стороны

...