Как использовать патч веб-API от C # - PullRequest
0 голосов
/ 20 октября 2019

Мне нужно использовать мой метод веб-API PATCH из кода C #. Мой контроллер выглядит следующим образом:

[HttpPatch("updateMessageTemplate/{templateId}")]
public IActionResult UpdateMessageTemplate([FromHeader] int clientId, int templateId,[FromBody] string template)
{
    try
    {
        notificationService.UpdateMessageTemplate(clientId,templateId,template);
        return Accepted();
    }
    catch
    {
        return StatusCode(500);
    }
}

Я только что попробовал код C # следующим образом, чтобы использовать мой метод API PATCH.

public string UpdateMessageTemplate(string token, int clientId, int templateID, string template)
{
    try
    {

        string serviceUrl = string.Format("{0}/notification/updateMessageTemplate/{1}", ConfigurationManager.AppSettings["APIURL"], templateID);

        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Add("clientId", clientId.ToString());
        client.DefaultRequestHeaders.Add("Authorization", string.Format("bearer {0}", token));
        var response = client.PatchAsync(serviceUrl).Result;
        return response;

    }
    catch (Exception ex)
    {
        NameValueCollection logParams = new NameValueCollection();
        Logger.LogErrorEvent(ex, logParams);
        throw;
    }
}

Но указанный выше метод потребления неправильный. Подскажите, пожалуйста, как правильно его употреблять?

1 Ответ

1 голос
/ 20 октября 2019

Ваш код имеет две проблемы:

  • string.Format("{0}/notification/updateMessageTemplate", ConfigurationManager.AppSettings["APIURL"], templateID) не добавляет идентификатор шаблона.

  • Вы не передаете template кактело для запроса

    public string UpdateMessageTemplate(string token, int clientId, int templateID, string template)
    {
        try
        {
           string serviceUrl =$"{ConfigurationManager.AppSettings["APIURL"]}/notification/updateMessageTemplate/{templateID}";
    
           HttpClient client = new HttpClient();
           StringContent content = new StringContent(template);
           client.DefaultRequestHeaders.Add("clientId", clientId.ToString());
           client.DefaultRequestHeaders.Add("Authorization", string.Format("bearer {0}", token));
           var response = client.PatchAsync(serviceUrl, content).Result;
           return response;
    
        }
        catch (Exception ex)
        {
           NameValueCollection logParams = new NameValueCollection();
           Logger.LogErrorEvent(ex, logParams);
           throw;
         }
    }
    

Если ваш код ожидает кодировку и тип носителя в теле содержимого, используйте эту версию StringContent.

Вышеуказанный модифицированный код должен решить вашу проблему. Еще одно предложение - используйте цепочку aysnc / await вместо .Result при асинхронном вызове, который может создать тупик в вашем коде.

...