#parameters #trigger.io #native-methods
#параметры #trigger.io #native-методы
Вопрос:
Я пишу собственный модуль Android для Trigger.io . Этот метод определен в API.java .
public static void foo(final ForgeTask task, @ForgeParam("bar") final int bar) {
System.out.println("foo called " task.params);
task.success();
}
Когда я запускаю инспектор и ввожу 5
в текстовое поле for bar
, я вижу следующий вывод.
Called "test_test.foo" with "{"bar":"5"}"
Error for "test_test.foo" with "{"message":"Parameter 'bar' was of the wrong type, expected an int","type":"UNEXPECTED_FAILURE","subtype":null}"
Я получаю аналогичные ошибки, если bar
объявлено как long
или double
. Однако аналогичный API iOS работает нормально.
Как я могу протестировать этот метод в инспекторе Android?
Редактировать: я использую Trigger platform версии v2.1.7 (последняя версия на момент написания).
Ответ №1:
Похоже, что он отправляет 5 в виде строки, когда ваша функция ищет int.. Если триггер будет отправлять его только в виде строки, вы можете захотеть изменить int на string и преобразовать строку в int постфактум. Не лучшее решение, но я думаю, что это сработает, если trigger.io не дает вам возможности отправлять данные в виде int
Ответ №2:
Это связано с тем, что ввод текста html содержит строку и что эта строка никогда не анализируется в int .
Вариант 1
Вы можете исправить ForgeInspector/assets/src/js/inspector.js . Изменить:
$('#_run').click(function () {
var module = $('#_module').val();
var method = $('#_method').val();
var params = {};
$('.api_input input').each(function (i, x) {
params[$(x).attr('id')] = $(x).val();
});
$('#_output').prepend('<pre class="alert alert-info">Called "' module '.' method '" with "' JSON.stringify(params, null, '') '"</pre>');
forge.internal.call(module '.' method, params, function () {
$('#_output').prepend('<pre class="alert alert-success">Success for "' module '.' method '" with "' JSON.stringify(arguments[0], null, '') '"</pre>');
}, function () {
$('#_output').prepend('<pre class="alert alert-error">Error for "' module '.' method '" with "' JSON.stringify(arguments[0], null, '') '"</pre>');
})
});
Для
$('#_run').click(function () {
var module = $('#_module').val();
var method = $('#_method').val();
var paramTypes = modules[module][method];
var params = {};
$('.api_input input').each(function (i, x) {
switch (paramTypes[$(x).attr('id')].type) {
case 'int': params[$(x).attr('id')] = parseInt($(x).val()); break;
case 'long': params[$(x).attr('id')] = parseInt($(x).val()); break;
case 'double': params[$(x).attr('id')] = parseFloat($(x).val()); break;
default: params[$(x).attr('id')] = $(x).val();
}
});
$('#_output').prepend('<pre class="alert alert-info">Called "' module '.' method '" with "' JSON.stringify(params, null, '') '"</pre>');
forge.internal.call(module '.' method, params, function () {
$('#_output').prepend('<pre class="alert alert-success">Success for "' module '.' method '" with "' JSON.stringify(arguments[0], null, '') '"</pre>');
}, function () {
$('#_output').prepend('<pre class="alert alert-error">Error for "' module '.' method '" with "' JSON.stringify(arguments[0], null, '') '"</pre>');
})
});
Это преобразует значения в правильные типы.
Вариант 2
Вы также можете написать автоматический или интерактивный тест для проверки вашего метода API.
Ответ №3:
На данный момент я определил метод без параметров foo5
, который вызывает foo
.
public static void foo5(final ForgeTask task) {
API.foo(task, 5);
}