Каким должен быть маршрут в веб-интерфейсе? - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть этот метод в веб-API

public class ProjectsController : ApiController
    {
        [HttpGet]
        public string GetProjects(string searchKeyword, int startRow, int endRow)
        {
            DataSet dsResult = ProjectsDB.GetProjects(searchKeyword, startRow, endRow);

            if (dsResult == null)
            {
                dsResult = new DataSet();
            }

            return JsonConvert.SerializeObject(dsResult, Formatting.Indented);
        }
    }

и конфиги маршрута:

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 }
            );
        }
    }

и

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

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

Функция вызова:

private async Task<List<Project>> GetProjects(ResultFilters model)
        {
            HttpResponseMessage httpResponse = null;
            string response = null;
            List<Project> lstProjects = new List<Project>();

            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(GlobalConstants.WebAPIURL + "/api/Projects/GetProjects");
                client.DefaultRequestHeaders.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                httpResponse = await client.PostAsJsonAsync(client.BaseAddress, model).ConfigureAwait(false);

                if (httpResponse.IsSuccessStatusCode)
                {
                    response = httpResponse.Content.ReadAsStringAsync().Result;
                    lstProjects = JsonConvert.DeserializeObject<List<Project>>(response);
                }                 
            }

            return lstProjects;
        }

Объект ResultFilters имеет значения параметров, которые требуются для метода API.

Приведенный выше код не возвращает данных, и я подозреваю, что API не получен или может быть проблема маршрутизации,Мне также не повезло в отладке веб-API.

  1. Что я здесь не так делаю.
  2. Если необходимо изменить настройки маршрута, будет несколько методовдля каждого контроллера каждый может иметь разные параметры.

1 Ответ

0 голосов
/ 20 февраля 2019

у вас есть метод GET, и вы выдавали POST против него.

Я подозреваю, что вы хотели бы, чтобы это был POST, поэтому измените HTTP-глагол в вашем методе API.

Затем проверьте свою модель и убедитесь, что она соответствует тому, что нужно методу API.

модель должна выглядеть следующим образом:

public class ResultFilters {
   public string searchKeyword { get; set; }
   public int startRow { get; set; }
   public int endRow { get; set; }
}

ваш метод API может выглядеть следующим образом:

[HttpPost]
        public string FilterProjects([FromBody] ResultFilters filters)
        {
            DataSet dsResult = ProjectsDB.GetProjects(filters.searchKeyword, filters.startRow, filters.endRow);

            if (dsResult == null)
            {
                dsResult = new DataSet();
            }

            return JsonConvert.SerializeObject(dsResult, Formatting.Indented);
        }

Конечно, вам нужно посмотреть на имена методов, нетточка, имеющая метод GetProjects , который является POST .Я на самом деле переименовал его в своем ответе, потому что не могу вынести это Get, которое является ошибкой POST .

Если вы хотите изменить его на get, то вы можете использовать атрибут FromURI иконечно, измените свой телефонный код соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...