0

我正在尝试创建一个简单ASP.NET Web API的获取、发布、放置和删除条目(pharmacyName, pharmacyAddress, pharmacyCategory)MySQL数据库中的方法。我的两个"GET"函数都成功执行,但是当我测试POST, PUT或中的DELETE功能时Postman,我收到以下错误:

"Message": "请求的资源不支持 http 方法 'POST'。"

我已经在论坛和网络上搜索了解决方案,但我一直无法找到与我的案例相关的答案。我是初学者,所以如果我忽略了某些内容或使用了不正确/令人困惑的术语或编码结构,请原谅我。

我在 Postman 中使用的请求 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 }
            );
        }
    }
4

1 回答 1

1

字符串、int、float等简单类型将从 .Net 框架中的查询字符串中获取,而复杂类型总是从正文中获取。

解决方案-1

在这种情况下,.Net Framework 期望来自查询参数的字符串pharmacyAddresspharmacyCategory,您可以像这样调用您的 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

解决方案-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
}

现在你可以像这样通过 body 传递参数来使用你的 API

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

pharmacyAddress=myaddress&pharmacyCategory=mycategory&pharmacyName=nameOfPharmacy

它肯定会像我已经实施和测试的那样工作

于 2020-02-26T14:28:24.330 回答