Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
vp-webdev
6 лет назад

Получение постов Голоса в android-приложении


Продолжим цикл статей про работу с блокчейном голоса. За это время код был приведён в человеческий вид. Начнём.

Рефакторинг кода.

Наша цель - получить номер блока и получить данные из него данные типа "comment". Поэтому первый код перевёл в метод getNumberBlock и getContent.

И перепишем метод onMessage, принимающий аргумент - входную json строку от сервера.

Первым делом строку преобразуем в JSON объект.

Не забываем про try/catch.

try{
    JSONObject data = new JSONObject(text);
}catch(JSONException e){
    e.printStackTrace();
}

Далее, как помним, а если не помним, то освежаем память, нам надо проверить метод, он должен равняться notice или id запроса, и должен равняться 2.

Делаем проверку на наличие занчений в полученом JSON Объекте.

if (data.has("id")){

}else if(data.has("method")){

}

Первое условие проверяет есть ли ключ id если нет, то проверяем ключ method.

Если есть ключ id, то получаем его и проверяем чему он равняется.

int idRequest = data.getInt("id");  
if(idRequest == 2) {  
    this.getContent(data);  
}

Всё просто, получаем "id" и сверяем его с "двойкой", если условие удовлетворяет, то передаём объект нашему методу getContent. Его опишем ниже.

Далее работаем с method. Если метод есть в блоке, то проверяем, чему он равен. А потом отправим его обратно в наш блокчеен, чтобы уже получить его данные.

String method = data.getString("method");  
if(Objects.equals(method, "notice")){  
    int hex = this.getNumberBlock(text);  
 try {  
        JSONObject blockSet = new JSONObject("{id:2, method: 'call', 'params':['database_api', 'get_ops_in_block', [" + hex + ",'false']]}");  
   webSocket.send(blockSet.toString());  
   } catch (JSONException ee) {  
        ee.toString();  
   }

Отмечу, что сравнение строк производил методом equals, о нем почитать тут.

Получаем сначала значение ключа method. Если оно равно notice, то идём дальше.

Отправляем в наш метод getNumberBlock JSON строку из которой мы получим номер блока. Опишем её ниже.

Получив номер блока, мы создаём JSON объект, передав туда номер блока и отправляем его в блокчейн.

getNumberBlock

Метод служит для получения номера блока. Мы его рассматривали в прошлой статье. В целом тут ничего не поменялось. Только отметим, что метод возвращает число(int). Полный код метода, можно посмотреть в листинге.

getContent

Весь функционал метода сводится к тому, что бы получить массив из JSON объекта и наоборот. Очень выручил сервис jsoneditoronline.org.

В этот метод мы получаем JSONobject и первым делом получаем массив result.

JSONArray result = data.getJSONArray("result");

Он хранит в себе объекты JSON. Чтобы получить их значения "прогуляемся" циклом.

for(int i = 0; result.length() >= i; i++){
}

В цикле, по ключу i, получим объекты

JSONObject resJson = result.getJSONObject(i);

В этих объектах имеется массив op

JSONArray resParam = resJson.getJSONArray("op");

хранящий в себе тип блока и его данные. Первым делом получим тип блока

String typeBlock = resParam.getString(0);

Нулевой индекс(0) потому что он первый в массиве.
И проверим равен ли он "comment".

if(Objects.equals(typeBlock, "comment")){

}

Внутри условия получим, например parent_author, по нему в дальнейшем определим статья это или комментарий.

JSONObject dataBlock = resParam.getJSONObject(1);
String parent_author = dataBlock.getString("parent_author");

Как видим, нам уже понадобился первый индекс-второй объект массива, в котором имеется ключ "parent_author".

Так, относительно просто, мы получили данные с блокчейна. Главное быть предельно внимательным. Спасибо за внимание!

Полный листинг

Материал подготовлен автором @zheev

0
103.963 GOLOS
На Golos с August 2017
Комментарии (3)
Сортировать по:
Сначала старые