1

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

  • boost.asio может посмотрите? – Jens Dec 04 '17 at 18:43
  • Не мне надо на winsock – vitya790 Dec 04 '17 at 18:49
  • Если вам надо на winsock - читайте материалы по ним. Крис Касперски неплохое введение в них написал. Потом читайте RFC на HTTP-протокол. На данный момент вопрос слишком общий и предполагает изложение вам слишком большого объема информации. – Владимир Мартьянов Dec 05 '17 at 07:54
  • отправить запрос можно использовав например библиотеку cpr – diralik Dec 05 '17 at 10:57

1 Answers1

-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;
}
Osyotr
  • 207