0 / 0 / 0
Регистрация: 19.12.2021
Сообщений: 54
1

Отправляем GET запрос на сервер и парсим ответ в JSON

19.12.2021, 01:38. Показов 24105. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <boost/beast.hpp>
#include <boost/asio/connect.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <string>
 
const static std::string MAIN_API = "api.guildwars2.com";
const static std::string API_ARGUMENTS = "/v2/items";
 
namespace http = boost::beast::http;
 
class Client
{
public:
    static std::string getResponse(std::string ip) 
    {
        boost::asio::io_context io;
        boost::asio::ip::tcp::resolver resolver(io);
        boost::asio::ip::tcp::socket socket(io);
 
        boost::asio::connect(socket, resolver.resolve(MAIN_API, "80"));
 
        http::request<http::string_body> req(http::verb::get, API_ARGUMENTS, 11);
 
        req.set(http::field::host, MAIN_API);
        req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);
 
        http::write(socket, req);
 
        std::string response;
        {
            boost::beast::flat_buffer buffer;
            http::response<http::dynamic_body> res;
            http::read(socket, buffer, res);
            response = boost::beast::buffers_to_string(res.body().data());
        }
 
        socket.shutdown(boost::asio::ip::tcp::socket::shutdown_both);
        return response;
    }
 
};
Нашел видео с иснтрукцией (https://www.youtube.com/watch?v=Qwb8gflYs0k).

Подскажите как заставить работать для сайта api.guildwars2.com/v2/items?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.12.2021, 01:38
Ответы с готовыми решениями:

Отправляем файл через FormData(), запрос есть, а массив $_FILES пустой (сервер не может распарсить запрос?)
Код практически весь из мурзилки отсюда Задача - отправить файл черех Ajax, поместив в...

JSON запрос и ответ
Коллеги здравствуйте есть задача отправить на БД запрос через API интерфейс и получить ответ...

Получить json в ответ на POST запрос
Никак не могу добиться получения json с помощью вывода его через echo в PHP скрипте. Если...

Сервер не возвращает ответ(передача данных формата json по api)
Есть код (сократил для поста), который с некоторой периодичностью передает данные формата json по...

26
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
19.12.2021, 08:37 2
а что не работает?
0
0 / 0 / 0
Регистрация: 19.12.2021
Сообщений: 54
19.12.2021, 08:43  [ТС] 3
Цитата Сообщение от GbaLog- Посмотреть сообщение
а что не работает?
Получает пустую строку.
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
19.12.2021, 08:47 4
Цитата Сообщение от WEewt345 Посмотреть сообщение
Получает пустую строку.
проверьте что http::read возвращает.
0
0 / 0 / 0
Регистрация: 19.12.2021
Сообщений: 54
19.12.2021, 08:52  [ТС] 5
Цитата Сообщение от GbaLog- Посмотреть сообщение
проверьте что http::read возвращает.
Возвращает 358
0
0 / 0 / 0
Регистрация: 19.12.2021
Сообщений: 54
19.12.2021, 09:06  [ТС] 6
C++
1
response
Миниатюры
Отправляем GET запрос на сервер и парсим ответ в JSON  
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
19.12.2021, 09:39 7
Цитата Сообщение от WEewt345 Посмотреть сообщение
Возвращает 358
я вот проверил вашу программу, похоже нужно вам использовать SSL.
Отправляем GET запрос на сервер и парсим ответ в JSON
0
0 / 0 / 0
Регистрация: 19.12.2021
Сообщений: 54
19.12.2021, 10:36  [ТС] 8
Цитата Сообщение от GbaLog- Посмотреть сообщение
я вот проверил вашу программу, похоже нужно вам использовать SSL.
C++
1
boost::asio::connect(socket, resolver.resolve(MAIN_API, "443"));
Изменил порт на 443

Код
<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
</body>
</html>
Получил вот такую строку, все равно не то что нужно...
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
19.12.2021, 10:44 9
Цитата Сообщение от WEewt345 Посмотреть сообщение
Изменил порт на 443
Цитата Сообщение от WEewt345 Посмотреть сообщение
Получил вот такую строку
так этого мало.
boost::asio так не начнёт https использовать.
вам нужен ssl socket.
https://www.boost.org/doc/libs... w/ssl.html
0
0 / 0 / 0
Регистрация: 19.12.2021
Сообщений: 54
19.12.2021, 12:04  [ТС] 10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#pragma once
 
#include <boost/beast.hpp>
#include <boost/asio/connect.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/ssl.hpp>
#include <string>
 
const static std::string MAIN_API = "api.guildwars2.com";
const static std::string API_ARGUMENTS = "/v2/items";
 
using boost::asio::ip::tcp;
namespace http = boost::beast::http;
namespace ssl = boost::asio::ssl; 
typedef ssl::stream<tcp::socket> ssl_socket;
 
class Client
{
public:
    static std::string getResponse(std::string ip) 
    {
        // Create a context that uses the default paths for
        // finding CA certificates.
        ssl::context ctx(ssl::context::sslv23);
        ctx.set_default_verify_paths();
 
        // Open a socket and connect it to the remote host.
        boost::asio::io_context io_context;
        ssl_socket sock(io_context, ctx);
        tcp::resolver resolver(io_context);
        tcp::resolver::query query("api.guildwars2.com", "https");
        boost::asio::connect(sock.lowest_layer(), resolver.resolve(query));
        sock.lowest_layer().set_option(tcp::no_delay(true));
 
        // Perform SSL handshake and verify the remote host's
        // certificate.
        sock.set_verify_mode(ssl::verify_peer);
        sock.set_verify_callback(ssl::rfc2818_verification("api.guildwars2.com"));
        sock.handshake(ssl_socket::client);
        
        
        std::string response;
        {
            boost::beast::flat_buffer buffer;
            http::response<http::dynamic_body> res;
            boost::system::error_code ec;
            int test = http::read(socket, buffer, res, ec);
            
            response = boost::beast::buffers_to_string(res.body().data());
        }
 
        return response;
    }
 
};
Теперь не компилируется.
0
0 / 0 / 0
Регистрация: 19.12.2021
Сообщений: 54
19.12.2021, 12:04  [ТС] 11
Ошибки
Миниатюры
Отправляем GET запрос на сервер и парсим ответ в JSON  
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
19.12.2021, 13:12 12
Цитата Сообщение от WEewt345 Посмотреть сообщение
Теперь не компилируется.
ну конечно. для работы boost::asio::ssl нужна библиотека OpenSSL.
процесс её установки и добавления в проект описать не могу, в Visual Studio не работаю.

Добавлено через 19 секунд
но на просторах интернета полно информации об этом.
1
0 / 0 / 0
Регистрация: 19.12.2021
Сообщений: 54
19.12.2021, 20:04  [ТС] 13
Цитата Сообщение от GbaLog- Посмотреть сообщение
ну конечно. для работы boost::asio::ssl нужна библиотека OpenSSL.
Скачал и установил библиотеку OpenSSL.

Теперь повылазили вот такие ошибки, как их исправить?
Миниатюры
Отправляем GET запрос на сервер и парсим ответ в JSON  
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
19.12.2021, 20:58 14
Цитата Сообщение от WEewt345 Посмотреть сообщение
Скачал и установил библиотеку OpenSSL.
откуда скачивали, как устанавливали?
0
0 / 0 / 0
Регистрация: 19.12.2021
Сообщений: 54
19.12.2021, 22:03  [ТС] 15
Цитата Сообщение от GbaLog- Посмотреть сообщение
откуда скачивали, как устанавливали?
https://www.youtube.com/watch?v=PMHEoBkxYaQ
Сделал все как показано на видео.

Добавлено через 31 минуту
Может быть потому что я скачал OpenSSL 3.0.0? Boost поддерживает данную версию OpenSSL?

Добавлено через 31 секунду
https://habr.com/ru/news/t/576892/
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
19.12.2021, 22:11 16
Цитата Сообщение от WEewt345 Посмотреть сообщение
Сделал все как показано на видео.
есть догадка, что буст не поддерживает последнюю версию OpenSSL(то есть 3.0), которую вы скачали.
и нужно качать из другой ветки.
попробуйте из этой: https://github.com/openssl/ope... 1_1-stable
1
0 / 0 / 0
Регистрация: 19.12.2021
Сообщений: 54
19.12.2021, 23:41  [ТС] 17
Цитата Сообщение от GbaLog- Посмотреть сообщение
есть догадка, что буст не поддерживает последнюю версию OpenSSL(то есть 3.0), которую вы скачали.
и нужно качать из другой ветки.
попробуйте из этой: https://github.com/openssl/ope... 1_1-stable
Теперь другие ошибки
Миниатюры
Отправляем GET запрос на сервер и парсим ответ в JSON  
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
20.12.2021, 07:02 18
Цитата Сообщение от WEewt345 Посмотреть сообщение
Теперь другие ошибки
в интернетах говорят, надо добавить библиотеку crypt32 в проект.
эта либа у вас уже должна быть в винде, её надо просто подключить.
как в VS подключаются либы, опять же, не подскажу.
знаю только, что можно прямо в коде подключать через #pragma comment(lib, "crypt32.dll"), но это фишка компилятора и в реальном коде такое лучше не делать, а добавлять через проект.
1
0 / 0 / 0
Регистрация: 19.12.2021
Сообщений: 54
20.12.2021, 11:33  [ТС] 19
Цитата Сообщение от GbaLog- Посмотреть сообщение
в интернетах говорят, надо добавить библиотеку crypt32 в проект.
эта либа у вас уже должна быть в винде, её надо просто подключить.
как в VS подключаются либы, опять же, не подскажу.
знаю только, что можно прямо в коде подключать через #pragma comment(lib, "crypt32.dll"), но это фишка компилятора и в реальном коде такое лучше не делать, а добавлять через проект.
Правильно говорят в интернетах.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#pragma once
#pragma comment (lib, "crypt32")
 
#include <boost/beast.hpp>
#include <boost/asio/connect.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/ssl.hpp>
#include <string>
 
const static std::string MAIN_API = "api.guildwars2.com";
const static std::string API_ARGUMENTS = "/v2/items";
 
using boost::asio::ip::tcp;
namespace http = boost::beast::http;
namespace ssl = boost::asio::ssl; 
typedef ssl::stream<tcp::socket> ssl_socket;
 
class Client
{
public:
    static void getResponse(std::string ip)
    {
        // Create a context that uses the default paths for
        // finding CA certificates.
        ssl::context ctx(ssl::context::sslv23);
        ctx.set_default_verify_paths();
 
        // Open a socket and connect it to the remote host.
        boost::asio::io_context io_context;
        ssl_socket sock(io_context, ctx);
        tcp::resolver resolver(io_context);
        tcp::resolver::query query("api.guildwars2.com", "https");
        boost::asio::connect(sock.lowest_layer(), resolver.resolve(query));
        sock.lowest_layer().set_option(tcp::no_delay(true));
 
        // Perform SSL handshake and verify the remote host's
        // certificate.
        sock.set_verify_mode(ssl::verify_peer);
        sock.set_verify_callback(ssl::rfc2818_verification("api.guildwars2.com"));
        sock.handshake(ssl_socket::client);
    }
 
};
Компилируется.

Теперь бы понять получить код страницы?

Добавлено через 8 минут
Теперь бы понять как получить код страницы api.guildwars2.com/v2/items ?**
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
20.12.2021, 12:06 20
мне кажется должно работать и как в первом посте, только вместо tcp::socket у вас ssl_socket.
разве так не работает?
0
20.12.2021, 12:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2021, 12:06
Помогаю со студенческими работами здесь

Запросы от JSON на PHP ( ответ на посл. запрос )
Здравствуйте форумчане, столкнулся с такой проблемой, принимаю от N-ого сервера JSON запросы и так...

JSON отправить запрос и получить ответ php-скриптом
Добрый день! Появилась следующая проблема: есть сайт, на который я отправляю json запрос и должен...

Парсим JSON
Добрый день. Я сформировал валидный JSON. CopePaste сформировал новый класс

JSON запрос на сервер
Добрый Добавлено через 6 минут Добрый вечер Делаю запрос в ВК API:...

Как передать Http get запрос, вложить в него json с токеном и настройками и получить ответ
Здравствуйте, подскажите, уже поломал голову, на Node Js получается, обычные запросы тоже принимаю,...

Сделать ajax запрос и получить json ответ данные и отобразить их на той же страничке, но в блоке ниже
Здравствуйте, нужно сверстать форму на чистом html &amp; css3 Сделать валидацию полей (имя, email,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru