c++ get-запрос, узнать инфо на сайте [дубликат]

213
05 декабря 2017, 21:13

На данный вопрос уже ответили:

  • Отправка GET/POST-запроса средствами чистого C++ 5 ответов

Как в c++ отправить get запрос? например: Отправляем запрос на vk.com и в консоль выводится Ф.И.О, как это сделать?

Answer 1

Ниже приведен пример того, как скачать файл, отправив GET запрос.

/*формирование самого запроса*/
std::string create_GET_request(const std::string &hostname, const std::string &path) {
    if(path.empty() || hostname.empty()) {
        return "";
    }
    else {
        return  "GET "  + path + " HTTP/1.1\r\n" +
                "Host:" + hostname + "\r\n" +
                "Connection: close\r\n\r\n";
    }
}
int main()
{
    std::string hostname = "foo.com";
    std::string path = "/bar/baz";
    std::string request = create_GET_request(hostname, path);
    if(request.empty()) {
        return 1;
    }
    char recvBuff[1024]; //буфер, в который будет записываться ответ
    int sock_descriptor;
    sock_descriptor = socket(AF_INET, SOCK_STREAM, 0);
    if(sock_descriptor < 0) {
        std::cout << "Failed creating socket\n" << std::endl;
    }
    struct sockaddr_in serv_addr;
    memset(&serv_addr, 0, sizeof(serv_addr));
    struct hostent *server;
    server = gethostbyname(hostname.c_str());
    if(server==NULL) {
        std::cout << "Failed to find server name" << std::endl;
        return 0;
    }
    serv_addr.sin_family = AF_INET;
    memcpy((char *) &(serv_addr.sin_addr.s_addr), (char *)(server->h_addr), server->h_length);
    serv_addr.sin_port = htons(80);
    if(connect(sock_descriptor, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { //подключение к серверу
        std::cout << "Failed to connect to server" << std::endl;
    } else {
        std::cout << "Succesfully connected" << std::endl;
    }
    write(sock_descriptor, request.c_str(), request.size()); //отправка запроса
    bool isFile = false;
    std::ofstream outFile;
    std::string filename = basename(path);
    if(filename.empty())
        std::cout << "Incorrect filename!\n";
    outFile.open(filename, std::ios::out /*| std::ios::binary*/);
    int bytes;
    const char* phrase = "\r\n\r\n";

    while(true) {
        memset(recvBuff, 0, 1024);
        if((bytes = read(sock_descriptor, recvBuff, sizeof(recvBuff)-1)) > 0) { //получение ответа
            std::cout << bytes << std::endl;
            if(isFile) {
                outFile.write(recvBuff, bytes);
            } else {
                std::cout << recvBuff << std::endl;
                char *remain = strstr(recvBuff, phrase); ///get end of body
                char *filename_begin = strstr(recvBuff, "filename*=UTF-8''"); ///get filename
                if(filename_begin) {
                    filename_begin += 17;
                    std::string true_filename(filename_begin);
                    int lenght = true_filename.find('\n');
                    filename_begin[lenght] = '\0';
                    std::cout << true_filename << std::endl;
                }
                if(remain) {
                    remain += 4; //move ahead of \r\n\r\n;
                    int len = bytes - (remain - recvBuff);
                    outFile.write(remain, len);
                    isFile = true;
                }
            }
        } else {
            outFile.close();
            return 0;
        }
    }
    outFile.close();
    std::cout << "finished";
    return 0;
}
READ ALSO
Инициализация сервера

Инициализация сервера

Всем привет, продолжая изучать javaEE (servlets) столкнулся с проблемойИспользую куки, хранящие какую локаль использовать юзеру

190
Вопрос по кэшировании хэш-кода string&#39;ом

Вопрос по кэшировании хэш-кода string'ом

Сегодня встретил следующую фразу "Класс String-кэширует хэш-код при первом вызове метода hashCode"Вопросы: Зачем он его кэширует? Почему при первом...

181
Отличия между OutputStream, BufferedWriter и FileWriter

Отличия между OutputStream, BufferedWriter и FileWriter

Вот варианты применения этих методовКогда какой использовать и чем они отличаются?

170
Почему не инициализируются бины?

Почему не инициализируются бины?

Есть несколько классов объекты которых должны создаваться спрингом:

177