Конференция "Сети" » TClientSocket и HTTP
 
  • 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.
 
Конференция "Сети" » TClientSocket и HTTP
Есть новые Нет новых   [134427   +35][b:0][p:0.001]