Страница 1 из 2

NetTalk - GetWeather example

Добавлено: 11 Июль 2018, 9:18
morkovin
Clarion 6.9049. C10 ABC
У кого-нибудь этот пример работает? Пробовал и NetTalk6 и в NetTalk8. Не работает.
Raw send

Код: Выделить всё

GET //globalweather.asmx/GetWeather?CityName=Moscow&CountryName=Russia HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Accept-Language: en
Content-Type: application/x-www-form-urlencoded
Accept-Encoding:  gzip
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16 ( .NET CLR 3.5.30729; .NET4.0C)
Host: www.webservicex.net
Connection: Keep-Alive
Raw receive

Код: Выделить всё

HTTP/1.1 404 Not Found
Server: nginx/1.4.6 (Ubuntu)
Date: Wed, 11 Jul 2018 06:10:26 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 53
Connection: keep-alive
{"code":"PAGE_NOT_FOUND","message":"Page not found"}
Есть другие варианты, как из Клариона обратиться к Web-service?

NetTalk - GetWeather example

Добавлено: 11 Июль 2018, 9:58
PavelNK
Дело не в Кларионе, судя по всему сервис не работает или что-то поменялось

NetTalk - GetWeather example

Добавлено: 12 Июль 2018, 6:22
morkovin
Да, действительно что-то поменялось.
Короткий пример на node.js выдаёт тот же результат:{"code":"PAGE_NOT_FOUND","message":"Page not found"}

Код: Выделить всё

var http = require('http');
http.post = require('http-post');
var url =
 'http://www.webservicex.net/globalweather.asmx/GetCitiesByCountry';
var CountryName = 'Russia';
http.post (url, {CountryName:CountryName}, function(res) {
res.setEncoding('utf8');
res.on('data', function(chunk) {
    console.log(chunk);
});
})

NetTalk - GetWeather example

Добавлено: 13 Июль 2018, 3:35
Admin
Там сервис сломали что ли. Ссылки на API у них вроде другие стали.
Может к Кладру подвязаться: https://kladr-api.ru/integration/
или к вконтактику: https://vk.com/dev/database.getCities

NetTalk - GetWeather example

Добавлено: 19 Июль 2018, 15:33
morkovin
Может к Кладру подвязаться: https://kladr-api.ru/integration/
Получилось! На простой запрос:

Код: Выделить всё

const kladrApi = require("kladrapi-for-node");
// для бесплатной версии
const Kladr = new kladrApi();
q = {query: 'волг', regionId: '3400000000000', contentType: 'city', withParent: 0, limit: 5};
//q = {query: 'Ряз',  contentType: 'region', withParent: 0, limit: 5};

Kladr.getData(q, (err, result)=>{
   textChunk = result.toString('binary');
    console.log(err, result);
});
Получаю ответ:

Код: Выделить всё

null { searchContext: 
   { contentType: 'city',
     regionId: '3400000000000',
     query: 'волг',
     limit: 5 },
  result: 
   [ { id: '3400000100000',
       name: 'Волгоград',
       zip: 400038,
       type: 'Город',
       typeShort: 'г',
       okato: '18401000000',
       contentType: 'city' },
     { id: '3401000000800',
       name: 'Волгодонской',
       zip: 404541,
       type: 'Поселение',
       typeShort: 'п',
       okato: '18216832001',
       contentType: 'city' },
     { id: '3401000000900',
       name: 'Отделение N 2 Совхоза Волго-Дон',
       zip: 404545,
       type: 'Поселение',
       typeShort: 'п',
       okato: '18216844002',
       contentType: 'city' },
     { id: '3400000109900',
       name: 'Волгострой',
       zip: 400067,
       type: 'Хутор',
       typeShort: 'х',
       okato: '18401370000',
       contentType: 'city' } ] }
осталось совсем ничего - наладить обмен node.js+Clarion (либО через сокеты ) , распарсить ответ, разобраться с перекодировками :cry:

NetTalk - GetWeather example

Добавлено: 19 Июль 2018, 16:41
Yufil
Работал с web-сервисами напрямую из Клариона по протоколу SOAP, слегка модифицировав класс chttp . Можно, наверное, чуть допилить и json переправить...

NetTalk - GetWeather example

Добавлено: 19 Июль 2018, 20:19
morkovin
распарсить ответ
Оказалось проще, чем я думал:

Код: Выделить всё

const kladrApi = require("kladrapi-for-node");
var parseJson = require("parse-json");
const Kladr = new kladrApi();
var textChunk='';
//must be receive from Clarion
q = {query: 'волг', regionId: '3400000000000', contentType: 'city', withParent: 0, limit: 10};
//---------------------------------
Kladr.getData(q, (err, result)=>{
   var js1 = JSON.stringify(result);
   var pos=js1.search('result');
   if (pos > 0) {
   textChunk=js1.slice(pos+8, js1.length-1);
   var out=JSON.parse(textChunk);
   var cnt=out.length;
   console.log('found: '+cnt);
   for(var i = 0; i < cnt; i++) {
     console.log(out[i]["name"]);  //will be send to clarion
    }
   }
});
ответ:

Код: Выделить всё

ound: 4
Волгоград
Волгодонской
Отделение N 2 Совхоза Волго-Дон
Волгострой
остались сокеты...

NetTalk - GetWeather example

Добавлено: 19 Июль 2018, 21:34
morkovin
Здесь фильтр по 34-му региону (но это уже детали):

Код: Выделить всё

const kladrApi = require("kladrapi-for-node");
var parseJson = require("parse-json");
const Kladr = new kladrApi();

var net = require('net');
var windows1251 = require('windows-1251');
var textChunk='';
var Chunk='';
var js0='';
var server = net.createServer(function(socket) {
  socket.on('data', function(data){
     textChunk = data.toString('binary');
     //console.log(textChunk);
     Chunk=windows1251.decode(textChunk);
     //console.log(Chunk); 
    if (Chunk.length > 50) {
       js0 = JSON.parse(Chunk); 
       var myMSGTEXT=JSON.stringify(js0.CMDDATA.MSGTEXT);
		console.log('MSGTEXT: '+myMSGTEXT);
      //must be receive from Clarion
      var q = {query: 'волг', regionId: '3400000000000', contentType: 'city', withParent: 0, limit: 10};
      var qs=JSON.stringify(q);
	  qs=JSON.parse(qs);
	  qs.query=myMSGTEXT;
      console.log('qs.query: '+qs.query);
    }	  
//---------------------------------
  Kladr.getData(qs, (err, result)=>{
   var js1 = JSON.stringify(result);
   var pos=js1.search('result');
   if (pos > 0) {
   textChunk=js1.slice(pos+8, js1.length-1);
   var out=JSON.parse(textChunk);
   var cnt=out.length;
   console.log('found: '+cnt);
   for(var i = 0; i < cnt; i++) {
     //console.log(out[i]["name"]);  //will be send to clarion
	    js0.CMDDATA.MSGTEXT=js0.CMDDATA.MSGTEXT+'; '+out[i]["name"];
    }
		Chunk=JSON.stringify(js0);
		//console.log(js0.CMDDATA.MSGTEXT);
		socket.write(Chunk.toString('binary')); //utf8
   }
   });  //kladr.getData
  });  //socket on
});  //create Server

server.listen(1337, '127.0.0.1');
для сокетов подрихтовал пример QuckChat. Работает! (см скрин в аттаче)

NetTalk - GetWeather example

Добавлено: 19 Июль 2018, 21:41
Дед Пахом
morkovin писал(а): 19 Июль 2018, 21:34 var qs=JSON.stringify(q);
qs=JSON.parse(qs);
а это зачем? И вообще, что всё это (весь код) значит?

NetTalk - GetWeather example

Добавлено: 19 Июль 2018, 21:56
morkovin
var q = {query: 'волг', regionId: '3400000000000', contentType: 'city', withParent: 0, limit: 10};
Как в этой строке использовать переменные ? (ну я не настолько силен в node.js)
А вот так получается:

Код: Выделить всё

 var qs=JSON.stringify(q);
	  qs=JSON.parse(qs);
	  qs.query=myMSGTEXT;
далее можно добавить:
qs.regionId=myRegionId ;
qs.contentType=myCT;
и т.д. в результате формируем правильный запрос к KLADR API.

NetTalk - GetWeather example

Добавлено: 19 Июль 2018, 22:41
Дед Пахом
Я хочу сказать, что может быть всё это выкладывать на форуме node.js?

NetTalk - GetWeather example

Добавлено: 20 Июль 2018, 11:06
finsoftrz
Ребят, а зачем такие извраты с js и nettalk? Просто пишем несколько строк на php и вызываем из своего приложения через win api. Результат получаем в виде строки, уже не раз обсуждали на этом форуме. Пример кода на php, думаю, гуглится на раз. А иметь хостинг с php для разработчика или конторы - это сейчас как платочек в кармане для джентельмена...

NetTalk - GetWeather example

Добавлено: 20 Июль 2018, 13:56
morkovin
хостинг с php для разработчика или конторы - это сейчас как платочек в кармане для джентельмена...
Слабый аргумент для бюджетной организации.
С php я как-то не подружился, а node.js использую активно для своих служебных задач.

NetTalk - GetWeather example

Добавлено: 20 Июль 2018, 14:57
PavelNK
Зачем мудрить, из Клаши все отлично тянется, из любых SOAP-ов и прочих сервисов

NetTalk - GetWeather example

Добавлено: 20 Июль 2018, 15:41
finsoftrz
У меня 2 аргумента в пользу работы через php. Не надо клиентам обновлять программы, положил один php файлик, все через него работают без лишних подробностей. Поменялось что в сервисе, поменяли в одном месте. Все равно в интернет лезем. Ну и второе, примеры кода на php найти можно за пару минут, а прикрутить аналогичное на кларионе думать надо...