CppRest ПОЛУЧИТЬ не получает тело? - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь получить содержимое истории ревизий страницы Википедии, чтобы проанализировать дату и размер различных ревизий.

Когда я запускаю GET на https://en.wikipedia.org/w/index.php?title=Barbecue&action=history с Почтальоном (послеотключив дополнительные элементы, добавленные настройками Почтальона) я получаю полную страницу со всем содержимым тела.

Теперь я пытаюсь сделать то же самое с CPPRESTSDK со следующим кодом

#include "cpprest/http_client.h"

using namespace web::http;
using namespace web::http::client;

void main()
{
  http_client mHttpClient(U("https://en.wikipedia.org"));

  http_request mRequest(methods::GET);
  mRequest.set_request_uri(U("w/index.php?title=Barbecue&action=history"));
  mRequest.headers().add(header_names::content_type, U("text/html"));

  http_response wResponse;
  wResponse = mHttpClient.request(mRequest).get();
  ucout << wResponse.to_string();
}

, что я ожидаю получить то же, что дает мне Почтальон, но похоже, что я получаю только заголовок ответа.Что я забыл?

1 Ответ

0 голосов
/ 28 сентября 2018

Я нашел способ сделать это.

Сначала я попытался wait() на http_response, но исполнение там было с помехами.Когда я решил прочитать ответ char по char, я увидел, что не только я получал полный ответ, но что этот ответ никогда не заканчивался и не вызывал -1 до Рагнарока.

Моя гипотезав том, что серверы Wiki поддерживают соединение в том случае, если они хотят транслировать событие в браузер, и фактически, глядя на источник страницы, вы можете найти этот бит кода:

var messaging = vAPI.messaging;
...
messaging.Connection.pagehide = function() {
   for ( var connection of this.connections.values() ) {
        connection.disconnect();
        connection.handler(connection.toDetails('connectionBroken'));
    }
}.bind(messaging);
window.addEventListener('pagehide', messaging.Connection.pagehide);

, который полностьювыглядит как то, что будет держать соединение GET-запроса открытым:)


Вот код, который я использовал, чтобы получить HTML страницы в конце.Я просто читаю это понемногу, пока не получу -1, пока это делает свое дело.Если вы играете с этим, помните об ограничении скорости этих серверов.Счастливого соскоба!

#include "cpprest/http_client.h"
#include <string>
using namespace std;
using namespace utility;
using namespace web::http;
using namespace web::http::client;

void main()
{
  http_client wHttpClient(U("https://en.wikipedia.org"));

  http_request wRequest(methods::GET);
  wRequest.set_request_uri(U("w/index.php?title=Barbecue&action=history"));

  http_response wResponse = wHttpClient.request(wRequest).get();

  long l;
  string str;

  while (true)
  {
    l = wResponse.body().read().get();
    if (l == -1) { break; }
    str += static_cast<char>(l);
  }

  cout << str;
}
...