Форум » [x]Harbour » Подключение по HTTP » Ответить

Подключение по HTTP

Dima: Что за либа мне нужна ? Ни когда ранее с этим не работал. Из доки по API приложения. [pre2] Пример для GET запроса: http://api.xxxxx.ua/WebSky/service.php/ConnectToServer?login=test&pass=test&tz=-180 В случае правильного логина и пароля и успешного подключения также возвращается HTTP cookie с параметрами сессии, для использования при отсылке следующих запросов. При успешном коннекте должен быть получен ответ «ок» - подключение прошло успешно. [/pre2] Собственно как слать такие запросы и как ловить ответы ?

Ответов - 33, стр: 1 2 All

Петр: Dima пишет: Что за либа мне нужна ? Ни когда ранее с этим не работал. hbtip - CLASS TIPClientHTTP FROM TIPClient, примеры в contrib есть hbcurl, curl - Using cURL to automate HTTP jobs

Dima: Петр Понял , спасибо , буду смотреть.

Dima: Что то лыжи не едут совсем с HbTip... Вот что пробовал сделать. В инструкции пишут что запросы должны быть или GET или POST. С GET вообще не срослось. [pre2] Proc Main() LOCAL oUrl, oClient local HQuery:={=>} HQuery["Curl"]:= "http://api.skyriver.ua/WebSky/service.php/" HQuery["LoginPass"]:= "ConnectToServer?login=Dima&pass=Dima&tz=-180" HQuery["GetAllTradePoints"]:="GetAllTradePoints?a=a" HQuery["Disconnect"]:= "Disconnect?a=1" REQUEST HB_CODEPAGE_UTF8 hb_cdpSelect( "UTF8" ) oUrl := TUrl():New( HQuery["Curl"] ) //oUrl:buildQuery() oClient := TIPClientHTTP():new( oUrl) oClient:nConnTimeout := 20000 IF oClient:Open() IF Empty( oClient:cReply ) // Следующие 2 строки с авторизацией сработают , oClient:post вернет .T. // Другая строка вернет XML строку // <?xml version="1.0" encoding="utf-8"?><string xmlns="http://gisserver.org/">ok</string> // Если это проделать руками через браузер то получу такую же строку ? oClient:post(" ",HQuery["Curl"]+HQuery["LoginPass"] ) ? oClient:ReadAll() // Следующие 2 строки с запросом неких данных , сопротивляются. // oClient:post вернет .F. а oClient:ReadAll вернет NIL // Если руками это сделать в браузере то получу в ответ строку XML, вида // <?xml version="1.0" encoding="utf-8"?><ArrayOfObjTree xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"></ArrayOfObjTree> ? oClient:post(" ",HQuery["Curl"]+HQuery["GetAllTradePoints"]) ? oClient:ReadAll() oClient:Get(HQuery["Disconnect"]) oClient:Close() ENDIF Endif return [/pre2] Пробовал либу Socket из поставки Minigui , картина примерно та же. Первый Get работает , остальные нет. Что не так делаю (целый день мучаю а сдвига нет) ? ЗЫ Логин и пасс в посте указаны с потолка.


fil: Ежели я правильно понял, то может имеет смысл пользовать объект MSXML2.XMLHTTP. Смотрим гугль как делать запросы

Dima: fil пишет: Ежели я правильно понял, то может имеет смысл пользовать объект MSXML2.XMLHTTP Да ты верно понял. Попробовал работает. Спасибо , буду тестить. Юра глянь на текст , ни чего добавить не надо ? Вроде работает. [pre2] xmldoc:=win_oleCREATEOBJECT("MSXML2.XMLHTTP") xmldoc:open("POST", HQuery["Curl"], .f.) xmldoc:Send() ? xmldoc:ReadyState // сделать цикл пока не 4 по таймауту ? xmldoc:responseText //ответ xmldoc:open("POST", HQuery["Curl"]+HQuery["LoginPass"], .f.) xmldoc:Send() ? xmldoc:ReadyState // цикл пока не 4 ? xmldoc:responseText //ответ xmldoc:open("POST", HQuery["Curl"]+HQuery["GetAllTradePoints"], .f.) xmldoc:Send() ? xmldoc:ReadyState // цикл пока не 4 ? xmldoc:responseText //ответ xmldoc:open("POST", HQuery["Curl"]+HQuery["Disconnect"], .f.) xmldoc:Send() ? xmldoc:ReadyState // цикл пока не 4 ? xmldoc:responseText //ответ xmldoc := NIL [/pre2]

Петр: Dima пишет: ни чего добавить не надо ? Если это будет передано заказчику - не хватает проверок, в т.ч. установлен ли MSXML [url=https://msdn.microsoft.com/ru-ru/library/ms753804(v=vs.85).aspx]Создание приложений MSXML[/url] Я, когда-то, немного поигрался этим MSXML - всякие оказии случались если с версиями не разберешся. P.S. На предосмотре ссылку показывает правильно, а так не хочет.

Dima: Петр пишет: Если это будет передано заказчику - не хватает проверок, в т.ч. установлен ли MSXML Так это просто тест. Первой проверкой будет [pre2] xmldoc:=win_oleCREATEOBJECT("MSXML2.XMLHTTP") if ValType(xmldoc) # "O" ? "Не могу создать объект MSXML2.XMLHTTP" endif [/pre2]

Dima: Дернул XML а он без переводов строки , строка на 200 кило. Excel его конечно жует , но хотелось бы разобраться со структурой. Как сказать объекту MSXML2.XMLHTTP что бы он делал переводы строк ?

fil: Вот такую пррверку надо добавить TRY ohttp:= CreateObject( "MSXML2.XMLHTTP" ) CATCH ohttp:= CreateObject( "microsoft.XMLHTTP" ) END Сконнектился, запросил, прочитал и ohttp:Abort(). Я именно из-за этого на бан нарывался от Avito

Dima: fil пишет: Вот такую пррверку надо добавить Спасибо. А как быть с получением ответа в виде XML ? Я пробнул xmldoc:responseXML ни чего не вернуло А так responseText , длинная строка в виде XML но без переводов строки

fil: MSXML2.XMLHTTP я исползовал только для получения HTML'a страниц. Ну и что, что без переводов строки, тебе на него смотреть ? Есть вроде как заточенные по XML редакторы там можно развернуть эту длинную строку в дерево

Dima: Да я же хотел после эту таблицу XML разобрать и сунуть в DBF

Петр: Dima пишет: и сунуть в DBF А там зачем перевод строки?

Dima: Петр пишет: А там зачем перевод строки? что бы открыть например в Far Manager и посмотреть какие тэги ловить , так как формат XML мне не известен. А когда все одной строкой идет , можно мозг сломать. Впрочем ладно. Загнал ее в Excel и пересохранил. Excel сделал переводы строк. Теперь можно разобраться.

Петр: Dima пишет: можно мозг сломать Это - да, но ведь не одним ёкселем или даже фаром (при всем уважении) .. редактор XML

Dima: Петр пишет: редактор XML Убедил Надо будет качнуть. Просто с XML редко дело имею , поэтому использовал то что есть.

Dima: Каким образом сказать xmldoc:responseText что бы текст он вернул в кодировке UTF8 ? Пока пришлось сделать так hb_cdpSelect( "UTF8" ) cc:=xmldoc:responseText hb_cdpSelect( "RU866" ) Пробовал так , не работает xmldoc:SetRequestHeader( "Content-Type","application/x-www-form-urlencoded; charset=UTF-8" )

Петр: Там очень много букв, но если осилите сможете рассказать и другим

Dima: Петр У меня в проге 866 кодировка REQUEST HB_CODEPAGE_RU866,HB_CODEPAGE_UTF8 ,HB_CODEPAGE_UTF8EX hb_cdpSelect( "RU866" ) responseText если я верно понял , возвращает строку в кодировке UTF-8 по умолчанию. По факту вернул строку в кодировке RU866 , хотя и в заголовке принятого XML написано UTF-8 Пробнул еще xmldoc:SetRequestHeader( "Content-Type","text/xml;charset=UTF-8" ) , ни чего не дало.

Петр: Dima пишет: меня в проге 866 кодировка REQUEST HB_CODEPAGE_RU866,HB_CODEPAGE_UTF8 ,HB_CODEPAGE_UTF8EX hb_cdpSelect( "RU866" ) А если установить hb_cdpSelect( "UTF8" ) какой результат получится?

Dima: Петр пишет: А если установить hb_cdpSelect( "UTF8" ) какой результат получится? Тогда все нормально. Будет в UTF8. Такое впечатление что возврат идет в кодировке установленной мануально.

Петр: Dima пишет: Такое впечатление что возврат идет в кодировке установленной мануально. Это как? Так и есть: msxml оперирует данными в U16, через механизм ole и виртуальную harbour машину, кодировка приводится к вот этой самой "установленной мануально". Как это работает можете рассмотреть в olecore.c. А можете не рассматривать - примите как факт.

Dima: Ясно...буду пока юзать костыль )) hb_cdpSelect( "UTF8" ) cc:=xmldoc:responseText hb_cdpSelect( "RU866" ) Работает.

Петр: Dima пишет: Ясно...буду пока юзать костыль Вот это не костыль. Так работает поддержка национальных кодировок в harbour. Зачем сразу в RU866 переходить?

Dima: Петр пишет: Зачем сразу в RU866 переходить? Ну как бы базы в ней живут да и код сырцов.

Петр: Понятно, по привычке. Я думал, проблемы с разбором строк, в harbour куча функций для работы с строками UTF8 и Unicode, привыкнуть можно.

Dima: Петр Спасибо за желание помочь !

fil: Dima, смог ли ты получить XML-документ (responseXML) ? Я делаю так ........................................... ohttp:setRequestHeader( 'Content-Type', 'text/xml') ohttp:Send(NIL) do while .T. if ohttp:readyState=4.and.ohttp:Status=200 ? ohttp:getResponseHeader("content-type") - возвращает 'text/html', ну и соответственно responseXML - nill. В чем засада не пойму

Dima: fil У меня так примерно [pre2] xmldoc:open("POST", HQuery["Curl"]+HQuery["Disconnect"], .f.) xmldoc:Send() ntime:=Seconds() do while xmldoc:ReadyState != 4 hb_releaseCPU() if ABS( Seconds() - nTime ) >= ntimeout ret[3]:="Сервер не отвечает" xmldoc:abort() xmldoc := NIL return ret endif enddo cret:=xmldoc:responseText [/pre2] c этим я игрался ohttp:setRequestHeader( 'Content-Type', 'text/xml' , и наигравшись забил )

fil: Ну responseText мне ни к чему. Хотел добраться до responseXML-документа и парсить его посредством DOM. Побьюсь еще. Уж больно неохота через ActiveX делать

Dima: Dima пишет: cret:=xmldoc:responseText Так я тут XML и получаю.

fil: Ты получаешь XML-левский текст, а мне нужен Document Object Model (DOM) страницы. Или я чего не понял ?

Dima: fil пишет: Ты получаешь XML-левский текст да fil пишет: а мне нужен Document Object Model (DOM) страницы. Тут ни чего не скажу , не юзал



полная версия страницы