Невозможно вызвать веб-API из Winform (ошибка запроса) - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь вызвать API из приложения winform, но получаю ошибку неверного запроса.Я думаю, что я не смог отформатировать правильную строку для моего пост-запроса.

Редактировать Добавление кода класса driverDayLogModel

driveDayLogModel.cs

public class driverDayLogModel
{
    public int driverId { get; set; }
    public DateTime dayStartTime { get; set; }
}

Код вызова API

driverDayLogModel driverDayLog = new driverDayLogModel
{
    driverId = Convert.ToInt32(txtId.Text),
    dayStartTime = DateTime.Now,
};
var js = new JavaScriptSerializer();
string json = JsonConvert.SerializeObject(driverDayLog);
using (var client = new HttpClient())
{
    client.BaseAddress = new Uri("http://127.0.0.1:54314/");
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    var response = client.PostAsJsonAsync("api/driverdaylogs", json).Result;
    if (response.IsSuccessStatusCode)
    {
        // Some Stuff
    }
    else
    {
        MessageBox.Show("Error Code" +
        response.StatusCode + " : Message - " + response.ReasonPhrase);
    }
}

Я получаюJson As "{\"driverId\":1,\"dayStartTime\":\"2019-03-03T21:44:15.1912313+05:00\"}" Что кажется недопустимым json для API, когда я пытаюсь использовать тот же json для почтальона, это также приводит к ошибке 400 Bad Request, но следует отметить, что когда я вызываю API с Json {"driverId":1,"dayStartTime":"2019-03-03T21:44:15.1912313+05:00"} Мой запрос идетуспешно API, и я получил ожидаемый ответ в POSTMAN.Я не могу преобразовать JSON в приемлемый формат для веб-папок в winforms

Ниже приведен код для Webapi.

public IHttpActionResult PostDayLogs([FromBody]driverDayLogModel log)
{
    if (!ModelState.IsValid)
    {
        return BadRequest();
    }
    var driverDayLog = new driverDailyLogs();
    driverDayLog.dayEndTime = DateTime.Now;
    driverDayLog.dayStartTime = log.dayStartTime;
    driverDayLog.driverId = log.driverId;
    var max = db.driverDailyLogs.OrderByDescending(r => r.id).FirstOrDefault();
    driverDayLog.id = max == null ? 1 : max.id + 1;
    driverDayLog.logDate = DateTime.Now.Date;
    db.driverDailyLogs.Add(driverDayLog);
    db.SaveChanges();
    return Ok(driverDayLog);
}

В WebApiConfig у меня есть следующий код

public static void Register(HttpConfiguration config)
{
    // Web API configuration and services
    config.Formatters.JsonFormatter
        .SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
    // Web API routes
    config.MapHttpAttributeRoutes();

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

Пожалуйста, направьте меня в этом отношении.

1 Ответ

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

Используя HttpClient, вам не нужно сериализовать свой объект в Json перед отправкой его в Web Api.HttpClient позаботится о сериализации для вас.

Редактировать (удален предыдущий код, который явно не работал)

Вместо отправки Json в PostAsJsonAsync, просто отправьте объект.

driverDayLogModel driverDayLog = new driverDayLogModel
{
    driverId = Convert.ToInt32(txtId.Text),
    dayStartTime = DateTime.Now,
};
using (var client = new HttpClient())
{
    client.BaseAddress = new Uri("http://127.0.0.1:54314/");
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    // simply put the object as the second parameter instead of a Json string
    var response = client.PostAsJsonAsync("api/driverdaylogs", driverDayLog).Result;
    if (response.IsSuccessStatusCode)
    {
        // Some Stuff
    }
    else
    {
        MessageBox.Show("Error Code" +
        response.StatusCode + " : Message - " + response.ReasonPhrase);
    }
}

В качестве примечания: использование .Result заблокирует ваш код, поэтому рекомендуется использовать await и async, но это за пределамиобъем этого вопроса / ответа.

...