-
Miau (17.07.15 20:39) [0]Есть желание запросить у сервера данные через HTTP и TClientSocket. Запрос отправляется, сервер отвечает. Ответ ловится на событии onRead. Проблема в том, что когда ответ длинный, его конец теряется.
Как бы получить недостающее?
Вот типичный заголовок ответа сервера. Обещает прислать 158 000, а реально присылает где-то 132 000.HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Origin, Content-Type, Accept, Authorization, X-Requested-With
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Origin: *
Cache-Control: max-age=1800, public
Content-Type: text/xml; charset=UTF-8
Date: Fri, 17 Jul 2015 17:02:20 GMT
Server: nginx/1.6.0
Vary: Accept-Encoding
X-Content-Type-Options: nosniff
X-Frame-Options: sameorigin
X-Mashery-Responder: prod-j-worker-eu-west-1b-25.mashery.com
X-XSS-Protection: 1; mode=block
Content-Length: 158298
Connection: keep-alive -
кгшзх © (19.07.15 01:06) [1]uses MSXML2_TLB;
...
with CoDOMDocument.Create do
begin
async := false;
if load('http://www.cbr.ru/scripts/XML_daily.asp') then
ShowMessage(Xml);
end; -
Miau (19.07.15 15:04) [2]С центробанком работает. Но с центробанком и обычный сокет справляется.
Почему на другой ссылке дохнет, не понимаю :(
Даже подобрал с небольшим объёмом ответа, на которой и сокет хорошо работал, всё равно не работает.
Load возвращает False. -
кгшзх © (19.07.15 17:09) [3]Ответ ловится на событии onRead.
он рид вызывается не единожды а по мере того, как будут доступны данные.
в других онрид и есть твои недостающие байты -
кгшзх © (19.07.15 17:12) [4]вопрос:
если ты с сервера получаешь xml документ используя сокет, то что ты будешь делать с текстовым контентом, который представляет собой xml документ?
будешь парсить его через pos и substr?
наверное нет.
наверное ты загрузишь его куда-нить.
так почему же сразу-то не вызвать метод load у какого-нибудь класса умеющего работать с xml как xml?
круглое носить, квадратное катать, а плац мести ломом? -
Miau (19.07.15 17:44) [5]
> он рид вызывается не единожды а по мере того, как будут
> доступны данные.
> в других онрид и есть твои недостающие байты
Это я понимаю. onRead вызывается раз пятнадцать-двадцать. Я просто склеиваю полученные данные. Так вот, на небольших данных это работает. А на длинных почему-то хвост не приходит.
> так почему же сразу-то не вызвать метод load у какого-нибудь
> класса умеющего работать с xml как xml?
>
Как видишь, не всегда классы нормально работают.
Но главное, мне хотелось просто посмотреть, как оно работает на уровень пониже :) -
кгшзх © (19.07.15 19:00) [6]хотелось смотреть - смотри.
хочется получить результат - юзай решение которое подсказали -
invis © (19.07.15 23:47) [7]Попробуй Synapse. Там только HTTP, без XML, зато исходники есть.
-
Miau (20.07.15 16:59) [8]Всем спасибо за помощь!
Ситуацию спасла компонентина THttpCli из библиотеки ICS.