response.Content.ReadAsStringAsync нет чтения всех данных - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть функция Azure, которая вызывает Rest API с базовой аутентификацией.Форма ответа на сервере в порядке, но у меня проблема с получением только частичных данных обратно из ответа - некоторые поля возвращаются как нулевые.

Я использую httpclient для выполнения вызова API остальных.Вот мой код:

  using (var client = new HttpClient())
        {

            var webUrl = "https://api.livechatinc.com/chats/XXXXXX";

            client.BaseAddress = new Uri(webUrl);
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            var user = "XXXXXXXXXX";
            var password = "XXXXXXXXX";
            var base64String = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{user}:{password}"));
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", base64String);

            HttpResponseMessage response   = await client.GetAsync(webUrl);
            response.EnsureSuccessStatusCode();

            //Only getting partial information
            string jsonString = await response.Content.ReadAsStringAsync();

            //Deserialise JSON
            Chat responseData = JsonConvert.DeserializeObject<Chat>(jsonString);

        }

Когда я запускаю отладчик функции Azure, я могу доказать, что получаю пустые поля для ожидаемых данных URL.

enter image description here

Обратите внимание, что поле responseData показывает нулевое значение для ChatStartUrl после десериализации.

Это потому, что поле не возвращается из содержимого ответа.

У меня естьудостоверился, что это не мой контракт данных и десериализация JSON.net.Мой контракт с данными:

 public  class Chat
{
    [JsonProperty("type")]
    public string Type { get; set; }

    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("tickets")]
    public Ticket[] Tickets { get; set; }

    [JsonProperty("visitor_name")]
    public string VisitorName { get; set; }

    [JsonProperty("visitor_id")]
    public string VisitorId { get; set; }

    [JsonProperty("visitor_ip")]
    public string VisitorIp { get; set; }

    [JsonProperty("visitor")]
    public Visitor Visitor { get; set; }

    [JsonProperty("agents")]
    public Agent[] Agents { get; set; }

    [JsonProperty("supervisors")]
    public object[] Supervisors { get; set; }

    [JsonProperty("rate")]
    public string Rate { get; set; }

    [JsonProperty("duration")]
    public long Duration { get; set; }

    [JsonProperty("chat_start_url")]
    public Uri ChatStartUrl { get; set; }

    [JsonProperty("referrer")]
    public Uri Referrer { get; set; }

    [JsonProperty("group")]
    public long[] Group { get; set; }

    [JsonProperty("started")]
    public string Started { get; set; }

    [JsonProperty("custom_variables")]
    public object[] CustomVariables { get; set; }

    [JsonProperty("pending")]
    public bool Pending { get; set; }

    [JsonProperty("tags")]
    public object[] Tags { get; set; }

    [JsonProperty("timezone")]
    public string Timezone { get; set; }

    [JsonProperty("greeting")]
    public Greeting Greeting { get; set; }

    [JsonProperty("messages")]
    public Event[] Messages { get; set; }

   /* [JsonProperty("prechat_survey")]
    public PrechatSurvey[] PrechatSurvey { get; set; }*/

    [JsonProperty("events")]
    public Event[] Events { get; set; }

    [JsonProperty("engagement")]
    public string Engagement { get; set; }

    [JsonProperty("started_timestamp")]
    public long StartedTimestamp { get; set; }

    [JsonProperty("ended_timestamp")]
    public long EndedTimestamp { get; set; }

    [JsonProperty("ended")]
    public string Ended { get; set; }
}

public  class Agent
{
    [JsonProperty("display_name")]
    public string DisplayName { get; set; }

    [JsonProperty("email")]
    public string Email { get; set; }

    [JsonProperty("ip")]
    public string Ip { get; set; }
}

public  class Event
{
    [JsonProperty("author_name", NullValueHandling = NullValueHandling.Ignore)]
    public string AuthorName { get; set; }

    [JsonProperty("text")]
    public string Text { get; set; }

    [JsonProperty("message_json", NullValueHandling = NullValueHandling.Ignore)]
    public string MessageJson { get; set; }

    [JsonProperty("date")]
    public string Date { get; set; }

    [JsonProperty("timestamp")]
    public long Timestamp { get; set; }

    [JsonProperty("agent_id", NullValueHandling = NullValueHandling.Ignore)]
    public string AgentId { get; set; }

    [JsonProperty("user_type")]
    public string UserType { get; set; }

    [JsonProperty("type")]
    public string Type { get; set; }

    [JsonProperty("welcome_message", NullValueHandling = NullValueHandling.Ignore)]
    public bool? WelcomeMessage { get; set; }

    [JsonProperty("event_type", NullValueHandling = NullValueHandling.Ignore)]
    public string EventType { get; set; }
}

public  class Greeting
{
    [JsonProperty("id")]
    public long Id { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }
}


public  class Ticket
{
    [JsonProperty("id")]
    public string Id { get; set; }
}

public  class Visitor
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("email")]
    public string Email { get; set; }

    [JsonProperty("ip")]
    public string Ip { get; set; }

    [JsonProperty("city")]
    public string City { get; set; }

    [JsonProperty("region")]
    public string Region { get; set; }

    [JsonProperty("country")]
    public string Country { get; set; }

    [JsonProperty("country_code")]
    public string CountryCode { get; set; }

    [JsonProperty("timezone")]
    public string Timezone { get; set; }

    [JsonProperty("user_agent")]
    public string UserAgent { get; set; }
}

Интересно то, что остальные API работают нормально в Почтальоне, и я могу получить все данные обратно.

Это то, что я получаю из ответа Почтальона

{
"type": "chat",
"id": "PPTE7XI3AQ",
"tickets": [
    {
        "id": "DJWKT"
    }
],
"visitor_name": "Rupinder Kaur",
"visitor_id": "S1552009602.e395581450",
"visitor_ip": "49.183.59.243",
"visitor": {
    "id": "S1552009602.e395581450",
    "name": "Rupinder Kaur",
    "email": "rupinder@creativa.com.au",
    "ip": "49.183.59.243",
    "city": "Abbotsford",
    "region": "Victoria",
    "country": "Australia",
    "country_code": "AU",
    "timezone": "Australia/Victoria",
    "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
},
"agents": [
    {
        "display_name": "David",
        "email": "david.sender@wiise.com",
        "ip": "203.30.93.14"
    }
],
"supervisors": [],
"rate": "not_rated",
"duration": 357,
"chat_start_url": "https://wiise.com/au/explore/detailed-accounting/?utm_source=googlewiise&utm_medium=paidsearch&utm_campaign=Wiise&gclid=EAIaIQobChMI3ZrLuqG14QIVBR2PCh0VIAb7EAAYASAAEgKkWPD_BwE",
"referrer": "https://www.google.com/",
"group": [
    0
],
"started": "Thu, 04/04/19 12:25:43 pm",
"custom_variables": [],
"pending": false,
"tags": [],
"timezone": "Australia/Sydney",
"greeting": {
    "id": 7991,
    "name": "Invite after 360 seconds"
},
"messages": [
    {
        "author_name": "David",
        "text": "Hi there :) \n\nThank you for checking out our website, how can I help?",
        "message_json": "",
        "date": "Thu, 04/04/19 12:25:43 pm",
        "timestamp": 1554341143,
        "agent_id": "david.sender@wiise.com",
        "user_type": "agent",
        "type": "message",
        "welcome_message": true
    },
    {
        "author_name": "Rupinder Kaur",
        "text": "hi there",
        "message_json": "",
        "date": "Thu, 04/04/19 12:25:54 pm",
        "timestamp": 1554341154,
        "user_type": "visitor",
        "type": "message"
    },
    {
        "author_name": "Rupinder Kaur",
        "text": "I would like to trial it",
        "message_json": "",
        "date": "Thu, 04/04/19 12:26:01 pm",
        "timestamp": 1554341161,
        "user_type": "visitor",
        "type": "message"
    },
    {
        "author_name": "Rupinder Kaur",
        "text": "I am mainly looking for cashflow reports",
        "message_json": "",
        "date": "Thu, 04/04/19 12:26:25 pm",
        "timestamp": 1554341185,
        "user_type": "visitor",
        "type": "message"
    }
],
"prechat_survey": [
    {
        "key": "Name:",
        "value": "xxxxxx",
        "id": "2001"
    },
    {
        "key": "E-mail:",
        "value": "xxxxxx",
        "id": "2002"
    }
],
"events": [
    {
        "author_name": "David",
        "text": "Hi there :) \n\nThank you for checking out our website, how can I help?",
        "message_json": "",
        "date": "Thu, 04/04/19 12:25:43 pm",
        "timestamp": 1554341143,
        "agent_id": "david.sender@wiise.com",
        "user_type": "agent",
        "type": "message",
        "welcome_message": true
    },
    {
       "author_name": "XXXXXX",
        "text": "XXXXXXXXXX",
        "message_json": "",
        "date": "Thu, 04/04/19 12:25:54 pm",
        "timestamp": 1554341154,
        "user_type": "visitor",
        "type": "message"
    },
    {
        "author_name": "XXXXXX",
        "text": "XXXXXXXXXX",
        "message_json": "",
        "date": "Thu, 04/04/19 12:26:01 pm",
        "timestamp": 1554341161,
        "user_type": "visitor",
        "type": "message"
    },
    {
        "author_name": "XXXXXX",
        "text": "XXXXXXXXXX",
        "message_json": "",
        "date": "Thu, 04/04/19 12:26:25 pm",
        "timestamp": 1554341185,
        "user_type": "visitor",
        "type": "message"
    },
    {
        "text": "Rupinder Kaur left the chat.",
        "date": "Thu, 04/04/19 12:31:40 pm",
        "timestamp": 1554341500,
        "type": "event",
        "event_type": "closed",
        "user_type": "visitor"
    }
],
"engagement": "auto_invite",
"started_timestamp": 1554341143,
"ended_timestamp": 1554341500,
"ended": "Thu, 04/04/19 12:31:40 pm"}

Я попытался десериализовать содержимое, возвращенное из Postman, и получил все данные без пустых полей

//This works
var testJSON = System.IO.File.ReadAllText(@"C:\temp\ChatSchema.json");
Chat responseData = JsonConvert.DeserializeObject<Chat>(testJSON);

Так что я подозреваю, что функция Content.ReadAsStringAsync не работает должным образом.

Я попробовал следующее и все еще имел ту же проблему:

       var buffer = await response.Content.ReadAsByteArrayAsync();
       var responseString = Encoding.UTF8.GetString(buffer, 0, buffer.Length);

       string content = responseString;
       Chat des = JsonConvert.DeserializeObject<Chat>(content);

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Только что решил мою проблему!

Мне пришлось добавить пользовательский заголовок, поскольку LiveChat требовал этого:

 client.DefaultRequestHeaders.Add("X-API-Version", "2");

Теперь я получаю всю информацию, включая данные Uri!

Спасибо за все ответы.

0 голосов
/ 09 апреля 2019

Чтобы прочитать необработанный текст, а затем десериализовать его в класс модели. Мне также пришлось изменить процедуру сериализации, чтобы сохранить ее как «UTF-8».

Вы можете сослаться на код, как показано ниже:

var stream = response.Content.ReadAsStreamAsync().Result;
StreamReader reader = new StreamReader(stream);
string text = reader.ReadToEnd();

string content = text;
string des = JsonConvert.DeserializeObject<Chat>(content);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...