У меня есть функция 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.
Обратите внимание, что поле 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);