Публикация данных объекта из консольного приложения в веб-API - PullRequest
0 голосов
/ 29 августа 2018

Я создаю консольное приложение в .Net Core, которое получает данные из Web API, обновляет эти данные и выполняет Put для обновления данных Web API. Я сталкиваюсь с проблемой, при которой я теряю свои данные в HttpRequestBuilder при отправке их в HttpContent, и веб-API не обновляется, но я возвращаю 200. Есть идеи, что я могу делать не так?

Контроллер:

public static async Task<HttpResponseMessage> UpdateTransaction(Transaction transaction)
{
    var requestUri = $"{baseUri}transactions/{transaction.ID}";
    return await HttpRequestFactory.Put(requestUri, transaction);
}

JsonContent:

public JsonContent(object value, string mediaType)
        :base(JsonConvert.SerializeObject(value), Encoding.UTF8, mediaType)
{
}

HttpRequestFactory:

public static async Task<HttpResponseMessage> Put(string requestUri, object value)
{
    var builder = new HttpRequestBuilder()
        .AddMethod(HttpMethod.Put)
        .AddRequestUri(requestUri)
        .AddContent(new JsonContent(value, "application/json"));

    return await builder.SendAsync();
}

HttpRequestBuilder:

 public HttpRequestBuilder AddContent(HttpContent content)
{
    this.content = content;
    return this;
}

public async Task<HttpResponseMessage> SendAsync()
{
    // Check required arguments
    EnsureArguments();

    // Setup request
    var request = new HttpRequestMessage
    {
        Method = this.method,
        RequestUri = new Uri(this.requestUri)
    };

    if (this.content != null)
        request.Content = this.content;

    request.Headers.Accept.Clear();
    if (!string.IsNullOrEmpty(this.acceptHeader))
        request.Headers.Accept.Add(
            new MediaTypeWithQualityHeaderValue(this.acceptHeader));

    // Setup client
    var client = new HttpClient();
    client.Timeout = this.timeout;

    var response = await client.SendAsync(request);

    return response;
}

1 Ответ

0 голосов
/ 29 августа 2018

Я не думаю, что класс JsonContent делает правильные вещи. Нам не хватает полного определения класса, поэтому я могу только догадываться:

Когда вы вызываете его в методе Put, он возвращает объект в .AddContent, но он, вероятно, не сериализуется как строка содержимого.

Измените метод Put, чтобы он вызывал метод JsonConvert напрямую.

HttpRequestFactory:

public static async Task<HttpResponseMessage> Put(string requestUri, object value)
{
    var builder = new HttpRequestBuilder()
        .AddMethod(HttpMethod.Put)
        .AddRequestUri(requestUri)
        .AddContent(JsonConvert.SerializeObject(value, Encoding.UTF8, "application/json"));

    return await builder.SendAsync();
}

Если вы хотите использовать свой класс JsonContent, то вам лучше использовать статический метод для преобразования, чем иерархию классов?

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