Отправка в веб-API - PullRequest
       19

Отправка в веб-API

0 голосов
/ 11 марта 2019

Каков наилучший или лучший способ обработки публикации в веб-интерфейсе и как это будет сделано с помощью C #?

Код веб-API

public class ProcessController : ApiController
{
    [HttpGet]
    public string Test()
    {
        return "Hello from API";
    }


    [HttpPost]
    public IHttpActionResult ApiPost(Model m)
    {
        return Ok();
    }
}

public class Model
{
    public int Id {get; set;}
    public string Name {get; set;}
}

Код для вызова веб-API

HttpClient client = new HttpClient(new HttpClientHandler { UseDefaultCredentials = true });
client.BaseAddress = new Uri("http://localhost:2478/api/Process/");

HttpResponseMessage response = await client.GetAsync("test");

Model m = new Model ();
m.Id= 4;
m.Name = "test";

var r = client.PostAsJsonAsync("ApiPost", m);

Возвращает 500 внутреннюю ошибку сервера. Здесь чего-то не хватает?

Конфигурация веб-API

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        var settings = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
        settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        settings.Formatting = Formatting.Indented;

        config.MapHttpAttributeRoutes();

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

    }
}

Ответы [ 2 ]

1 голос
/ 11 марта 2019

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

Без действия он не знал, какой метод использовать в контроллере API, так как не мог перенаправить его на него.

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

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Dashboard", action = "Index", id = UrlParameter.Optional }
        );
    }
1 голос
/ 11 марта 2019

Вы пробовали это: добавьте атрибут FromBody к вашей модели и опубликуйте модель, которая соответствует m в теле

[HttpPost]
public IHttpActionResult ApiPost([FromBody] Model m)
{
    return Ok();
}
...