1

Примеры вызовов Wialon Remote API

Topic: Примеры вызовов Wialon Remote API

Пробую WebAPI, в частности Remote API.
Получили доступ на http://testing.wialon.com/

Вот код
<?
$url = 'http://testing.wialon.com/wialon/ajax.h … core/login';
$params = array(
            "user"=>"наш_логин",
            "password"=>"наш_пароль"
        );

foreach($params as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
$fields_string = rtrim($fields_string,'&');

$ch = curl_init();

curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($params));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);

$result = curl_exec($ch);

curl_close($ch);

?>

Результат скрипта
{"error":4}

Можете дать примеры скриптов с примерами вызовов Remote API?
На php или другом скриптовом языке.

KazInterSoft - www.soft.kz
2

Примеры вызовов Wialon Remote API

Re: Примеры вызовов Wialon Remote API

kazintersoft wrote:

Результат скрипта
{"error":4}

Это говорит о том что сервер не получил необходимые параметры или переменные. Незная php трудно судить в чем у вас ошибка.
Попробуйте ввести в строку браузера ссылку http://testing.wialon.com/wialon/ajax.html?svc=core/login&params={"user":"apitest","password":"apitest"} , вы должны получить такой же результат на php, который будет выведен в окне браузера.

Mobile Development
Gurtam
3

Примеры вызовов Wialon Remote API

Re: Примеры вызовов Wialon Remote API

kazintersoft, все параметры передаются в json, а судя по коду у вас получилось что-то далёкое от json. Посмотрите примеры, они уже давно есть в документации.

4

Примеры вызовов Wialon Remote API

Re: Примеры вызовов Wialon Remote API

kopa wrote:

Попробуйте ввести в строку браузера ссылку http://testing.wialon.com/wialon/ajax.html?svc=core/login&params={"user":"apitest","password":"apitest"} , вы должны получить такой же результат на php, который будет выведен в окне браузера.

Спасибо всем. Будем разбираться.

KazInterSoft - www.soft.kz
5

Примеры вызовов Wialon Remote API

Re: Примеры вызовов Wialon Remote API

Так вроде работает.
Может кому будет интересно.

<?php
    print("wialon sdk php example");
   
    $_login_url = "http://testing.wialon.com/wialon/ajax.h … ssword:%s}";
   
    $login = "apitest";
    $password = "apitest";   
   
    $handle = fopen(sprintf($_login_url, $login, $password), "r");
    $login_response = "";
    while ( ($line = fgets($handle)) !== false) {
        $login_response.=$line;
    }

    print($login_response);
   
   
    fclose($handle);
?>

KazInterSoft - www.soft.kz
6

Примеры вызовов Wialon Remote API

Re: Примеры вызовов Wialon Remote API

kazintersoft, как вы писали в первом примере с использованием библиотеки curl, где использовали POST запрос, то так же желательно использовать POST запросы в большинстве случаев. Есть некоторые исключения, где возможен только GET запрос, например запрос картинок, но это исключения.

7

Примеры вызовов Wialon Remote API

(edited by kazintersoft 09/06/2012 22:35:19)

Re: Примеры вызовов Wialon Remote API

nevl wrote:

kazintersoft, как вы писали в первом примере с использованием библиотеки curl, где использовали POST запрос, то так же желательно использовать POST запросы в большинстве случаев. Есть некоторые исключения, где возможен только GET запрос, например запрос картинок, но это исключения.

Вот рабочий POST вариант для PHP

<?
$url = "http://testing.wialon.com/wialon/ajax.h … core/login";
$params = array(
            "user"=>"apitest",
            "password"=>"apitest"
        );

$json = json_encode($params);

$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POSTFIELDS,'params='.$json);
$result = curl_exec($ch);
curl_close($ch);
echo $result;
?>

KazInterSoft - www.soft.kz
8

Примеры вызовов Wialon Remote API

(edited by alexeyma 14/11/2012 18:00:24)

Re: Примеры вызовов Wialon Remote API

Здравствуйте!
Пробую подключиться к сервисам Wialon по Remote API.
Программа на С++, в частности на C++ Builder 6.
Пробовал использовать как сокеты так и Indy-компоненты.
Код (часть кода, отвечающая за посылку запроса серверу и прием) следующий:

void __fastcall TForm1::Button5Click(TObject *Sender)
{
   TStringList *s = new TStringList;
   TMemoryStream *fs = new TMemoryStream();

   AnsiString Request = "params={\"user\":\"apitest\",\"password\":\"apitest\"}";

   Memo2->Lines->Add(AnsiToUtf8(Request));

   s->Clear();
   s->Add(AnsiToUtf8(Request));

   IdHTTP1->Request->ContentLength = Request.Length();
   IdHTTP1->Post("/wialon/ajax.html?svc=core/login", s, fs);

   fs->SaveToFile("in.txt");

   s->Clear();
   s->LoadFromFile("in.txt");
   for(int i=0; i<s->Count; ++i) Memo2->Lines->Add(Utf8ToAnsi(s->Strings[i]));

   delete fs;
   delete s;
}

В результате от сервера приходит:

{"error":4}

Примерно то же самое происходит и при работе через сокет:

void __fastcall TForm1::BTestClick(TObject *Sender)
{
AnsiString Params =
"svc=core/login&params={user:apitest,password:apitest}";

AnsiString Request =
"POST /wialon/ajax.html HTTP/1.1\r\n\
Content-Length: "+IntToStr(Params.Length())+"\r\n\
Host: testing.wialon.com\r\n\
\r\n"
+Params+
"\r\n";

//пробовал добавлять это в запрос:
//Accept: application/jsonrequest\r\n\
//Content-Encoding: identity\r\n\
//Content-Type: application/jsonrequest\r\n\
//svc=core/login&params=%7Buser%3Aapitest%2Cpassword%3Aapitest%7D\r\n\

   Memo1->Lines->Add(Request);
   if(!ClientSocket1->Socket->Connected)
   {
      ClientSocket1->Open();
   }

   for(int i=0; i<5; ++i) ClientSocket1->Socket->SendText("\r\n"); //???
   ClientSocket1->Socket->SendText(Request);
   //ClientSocket1->Socket->SendText(AnsiToUtf8(Request));
}

Результат с сервера:

HTTP/1.1 200 OK
Date: Wed, 14 Nov 2012 12:32:04 GMT
Content-Type: application/json
Connection: keep-alive
Cache-Control: no-cache
Content-Length: 12
Server: adf_http_server/4.3.0182

{"error":4}

Что я делаю неправильно?
Если возможно, дайте, пожалуйста, примеры вызовов RemoteAPI на C или С++.

UPD: Ситуация меняется к лучшему если передавать POST-запрос с пустым телом или, как в нижеследующем примере, состоящим из одного символа, а параметры передавать в URL.
То есть если вместо строк

AnsiString Request = "params={\"user\":\"apitest\",\"password\":\"apitest\"}";

и

   IdHTTP1->Post("/wialon/ajax.html?svc=core/login", s, fs);

вставить строки

AnsiString Request = "";//пустое тело POST-запроса с Content-Length == 0

и

   
   IdHTTP1->Post("/wialon/ajax.html?svc=core/login&params={\"user\":\"apitest\",\"password\":\"apitest\"}", s, fs); //параметры - прямо в URL

соответственно, то все начинает работать.

UPD2: Проблема также решается если указать в заголовках тип контента Content-Type: application/x-www-form-urlencoded:

   IdHTTP1->Request->ContentType = "application/x-www-form-urlencoded";

для Indy-компонента, и

AnsiString Params =
"svc=core/login&params={user:apitest,password:apitest}";

AnsiString Request =
"POST /wialon/ajax.html HTTP/1.1\r\n\
Content-Type: application/x-www-form-urlencoded\r\n\
Content-Length: "+IntToStr(Params.Length())+"\r\n\
Host: testing.wialon.com\r\n\
\r\n"
+Params+
"\r\n";

для сокета.
Правильно ли это? Правильное ли это решение?
Как быть с остальными запросами API?
Пытаться передать их в теле POST-а или в URL?
Какой тип контента необходимо указывать?

9

Примеры вызовов Wialon Remote API

Re: Примеры вызовов Wialon Remote API

alexeyma wrote:

Как быть с остальными запросами API?
Пытаться передать их в теле POST-а или в URL?
Какой тип контента необходимо указывать?

Здравствуйте.
1. Используйте в проекте библиотеку libcurl. Она позволит не заморачиваться с сетевыми соединениями, формированием пакетов и парсированием ответа.
2. Указывайте POST.

Alexander Adamovich
flespi