Пользовательский заголовок в POST-запросе HttpClient не работает - PullRequest
1 голос
/ 27 января 2020

Я пытаюсь отправить запрос POST при использовании HttpClient. Когда я запускаю код, я получаю неавторизованный ответ. Но я могу заставить его работать в PostMan. Ниже приведен мой фрагмент кода и фотографии того, что я пытаюсь выполнить. Я хотел бы добавить, что я пытаюсь отправить строку json в моем теле.

using (HttpClient client = new HttpClient())
        {
            var connectionUrl = "https://api.accusoft.com/prizmdoc/ViewingSession";
            var content = new Dictionary<string, string> { { "type", "upload" }, { "displayName", "testdoc" } };
            // Serialize our concrete class into a JSON String
            var stringPayload = JsonConvert.SerializeObject(content);

            // Wrap our JSON inside a StringContent which then can be used by the HttpClient class
            var httpContent = new StringContent(stringPayload, Encoding.UTF8, "application/json");

            using (var httpClient = new HttpClient())
            {
                //client.DefaultRequestHeaders.Add("Acs-Api-Key", "aPsmKCmvkZHf9VakCmfHB8COmzRxXY5FDhj8F1FU1IGmQlOkfjiKESKxfm38lhey");
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Acs-Api-Key", "aPsmKCmvkZHf9VakCmfHB8COmzRxXY5FDhj8F1FU1IGmQlOkfjiKESKxfm38lhey");

                // Do the actual request and await the response
                var httpResponse =  httpClient.PostAsync(connectionUrl, httpContent).Result;

                if (httpResponse.StatusCode == HttpStatusCode.OK)
                {
                    // Do something with response. Example get content:
                    var connectionContent = httpResponse.Content.ReadAsStringAsync().Result;

                }
                else
                {
                    // Handle a bad response
                    return;
                }
            }
        }

PostMan Header Segment

PostMan Body Segment

Ответы [ 2 ]

1 голос
/ 27 января 2020

В дополнение к ответу Haldo,

В своем коде вы добавляете заголовок Acs-Api-Key как и Заголовок авторизации , то есть он выглядит как Authorization: Acs-Api-Key (key), а не Acs-Api-Key: (key), что у вас есть в PostMan.

Вместо добавления его в качестве заголовка авторизации, просто добавьте его в качестве обычного заголовка.

client.DefaultRequestHeaders.Add("Acs-Api-Key","(key)");

Также может возникнуть проблема, что вы не оборачиваете свой контент в объект «источник», как в PostMan. Есть несколько способов сделать это

Первый - просто обернуть его в строковый формат:

stringPayload = $"\"source\":{{{stringPayload}}}"

Или вы можете сделать это до сериализации, создав вместо этого собственный объект. иметь словарь

var content = new PayloadObject(new Source("upload", "testdoc"));
var stringPayload = JsonConvert.SerializeObject(content);

// Send the request

class PayloadObject{
    Source source {get; set;}
    PayloadObject(Source source){
        this.source = source;
    }
}
class Source{
    string type {get; set;}
    string displayName {get; set;}
    Source(string type, string displayName){
        this.type = type;
        this.displayName = displayName;
    }
}
1 голос
/ 27 января 2020

Вы используете два HttpClient с, когда вам нужно только одно.

using (HttpClient client = new HttpClient())

и

using (var httpClient = new HttpClient())

Второй (httpClient) выполняет сообщение, но заголовок аутентификации был добавлен к client. Просто удалите второй (httpClient) и убедитесь, что вы используете client.PostAsync(...) для отправки запроса.


Я бы также подумал об использовании await, а не .Result (см. Почему здесь ) при отправке запроса:

var httpResponse = await client.PostAsync(connectionUrl, httpContent);
...