Как получить ответ от сервера в Xamarin.Forms - PullRequest
0 голосов
/ 17 сентября 2018

Я создал HTTP-клиент, который отправляет данные на мой сервер. Эти данные будут запрашивать мой сервер, который будет возвращать объект JSON. Как я могу получить ответ JSON Object с моего сервера и вставить его в базу данных?

Приведенный ниже код отправит ContactID на мой сервер, и мой сервер вернет объект JSON. Как я могу получить объект JSON с моего сервера? Что я добавлю к своему коду? Я добавил

var data = await response.Content.ReadAsStringAsync();

но я не знаю, как поступить.

try
        {
            var db = DependencyService.Get<ISQLiteDB>();
            var conn = db.GetConnection();

            var sql = "SELECT * FROM tblUser WHERE ContactID = '" + contact + "'";
            var getUser = conn.QueryAsync<UserTable>(sql);
            var resultCount = getUser.Result.Count;

            //Check if the user has been sync
            if (resultCount < 1)
            {
                try
                {
                    syncStatus.Text = "Syncing user to server...";

                    var link = Constants.requestUrl + "Host=" + host + "&Database=" + database + "&Contact=" + contact + "&Request=8qApc8";
                    string contentType = "application/json";
                    JObject json = new JObject
                    {
                        { "ContactID", contact }
                    };

                    HttpClient client = new HttpClient();
                    var response = await client.PostAsync(link, new StringContent(json.ToString(), Encoding.UTF8, contentType));
                    var data = await response.Content.ReadAsStringAsync();

                    if (response.IsSuccessStatusCode)
                    {
                        var content = await response.Content.ReadAsStringAsync();
                        var userresult = JsonConvert.DeserializeObject<IList<UserData>>(content);
                        var count = userresult.Count;

                        for (int i = 0; i < count; i++)
                        {
                            try
                            {
                                syncStatus.Text = "Syncing user to server...";

                                var item = userresult[i];
                                var contactID = item.ContactID;
                                var userID = item.UserID;
                                var userPassword = item.UserPassword;
                                var userType = item.UserType;
                                var userStatus = item.UserStatus;
                                var lastSync = item.LastSync;
                                var serverUpdate = item.ServerUpdate;
                                var mobileUpdate = item.MobileUpdate;

                                var user = new UserTable
                                {
                                    ContactID = Convert.ToInt32(contactID),
                                    UserID = userID,
                                    UserPassword = userPassword,
                                    UserType = userType,
                                    UserStatus = userStatus,
                                    LastSync = lastSync,
                                    ServerUpdate = serverUpdate,
                                    MobileUpdate = mobileUpdate
                                };

                                await conn.InsertAsync(user);
                            }
                            catch (Exception ex)
                            {
                                Console.Write("Syncing user error " + ex.Message);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.Write("Syncing User Error " + ex.Message);
                }
            }

Мой PHP-код будет запрашивать мою базу данных с помощью ContactID , полученного от Xamarin HTTP Client .

$json_str = file_get_contents('php://input');
    $json_obj = json_decode($json_str);

    $ContactID = $json_obj->ContactID;

    $sql = "SELECT * FROM tblUser WHERE ContactID = '$ContactID'";
    $result = mysqli_query($conn, $sql);
    $count = mysqli_num_rows($result);

    if($count > 0){
        while ($row = @mysqli_fetch_array($result)) {
            $decr = CryptRC4(FromHexDump($row['UserPassword']), $key);

            $ar[] = array(
                'ContactID' => $row['ContactID'],
                'UserID' => $row['UserID'],
                'UserPassword' => $decr,
                'UserType' => $row['UserType'],
                'UserStatus' => $row['UserStatus'],
                'LastSync' => $sync,
                'ServerUpdate' => $row['ServerUpdate'],
                'MobileUpdate' => $row['MobileUpdate']
            );

            print json_encode($ar);

            //Update LastSync DateTime
            $sql = "UPDATE tblUser SET LastSync = '$sync' WHERE ContactID = '$ContactID'";
            mysqli_query($conn, $sql);
        }
    }    

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Предполагая, что вы все сделали правильно. Другими словами, вы сможете отправить свой contactID и вернуть json.

Допустим, ваша структура json выглядит примерно так: {"firstname" : "Doe", "lastname" : "foo" "age" : "27"}

Один из возможных способов получения данных приведен ниже:

using Newtonsoft.Json;

//after PostAsync()
if (response.IsSuccessStatusCode)
{
    var content = await response.Content.ReadAsStringAsync();
    JObject jContent = (JObject)JsonConvert.DeserializeObject(content);
    string firstName = (string)jContent.GetValue("firstname")
    string lastName = (string)jContent.GetValue("lastname");
    int age = (int)jContent.GetValue("age");
}

Newtonsoft доступно на Nuget. вам нужно установить его, если вы еще этого не сделали.

Улучшенное решение

Что если в вашем json есть много пар ключ / значение, как показано ниже:

{ key1 : value1, key2 : value2, key3 : value3, ... key10 : value10}

Тогда это не очень хорошая идея:

string foo1 = (string)jContent.GetValue("key1");
string foo2 = (string)jContent.GetValue("key2");
//...
string foo10 = (string)jContent.GetValue("key10");

Для обработки этого случая вы можете создать класс:

public class Foo
{
    public string Foo1 {get;set;}
    public string Foo2 {get;set;}
    //...
    public string Foo2 {get;set;}
}

Затем вы можете сделать так просто, как показано ниже:

if (response.IsSuccessStatusCode)
{
    var content = await response.Content.ReadAsStringAsync();
    Foo foo = JsonConvert.DeserializeObject<Foo>(content);
}

Улучшенное решение, ссылка на которое www.newtonsoft.com . Зайдите туда и ознакомьтесь с другими способами использования библиотеки.

0 голосов
/ 17 сентября 2018

В ответах выше отсутствует один важный момент -> efficiency.

Нет необходимости выделять строку в памяти, особенно если ваш JSON большой.Streams может работать намного лучше, чем string s:

// Read the response as stream
var stream = await response.Content.ReadAsStreamAsync();

// Use the next method for deserialization
T DeserializeJsonFromStream<T>(Stream stream)
{
    if (stream == null || stream.CanRead == false)
        return default(T);

    using (var sr = new StreamReader(stream))
    using (var jtr = new JsonTextReader(sr))
    {
        var js = new JsonSerializer();
        return js.Deserialize<T>(jtr);
    }
}

PS: Пример кода основан на Json.NET .PSS: Есть много хороших статей на эту тему, я мог бы рекомендовать ознакомиться со следующей одна .

0 голосов
/ 17 сентября 2018

Последнее утверждение в вашем примере выше дает список объектов json в строковом формате.

var data = await response.Content.ReadAsStringAsync();

Вам необходимо преобразовать это обратно в список объектов.Чтобы ваш проект знал об определении объекта, создайте простой класс с открытыми свойствами (что-то вроде ниже)

public class UserLog
{
    public int ContactId { get; set; }
    public string Log { get; set; }
    public DateTime LogDate { get; set; }
}

Добавить Newtonsoft.Json (от Джеймса Ньютона-Кинга) Nugetпакет для вашего проекта, чтобы вы могли работать с JSON.

Чтобы преобразовать содержимое переменной 'data' в список объектов UserLog, напишите код, подобный

var list = NewtonsoftUtil<IList<UserLog>>.DeserializeObject(data);

(добавьте using Newtonsoft.Json; вверху файла)

Пожалуйста, дайте мне знать, если это поможет.

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