Iniciar sesión

Ver la versión completa : C++ Peticion GET a pelo



swapd0
03/06/2021, 20:27
A ver, estoy intentando hacer peticiones a un servidor, pero no consigo que me devuelva nada, al menos ya no me da el error 400.

Si meto esta url en el navegador:
api.polygon.io/v2/aggs/ticker/C:EURUSD/range/1/minute/2021-06-02/2021-06-03?unadjusted=true&sort=asc&limit=5000&apiKey=*

Me devuelve:
{"status":"ERROR","request_id":"9372a31d354d5e008c159e40ec947cee","error":"Unknown API Key"}
Es normal porque la clave esta mal, poniendo mi clave me devuelve un chorro de datos.

Ahora haciendo desde C++.
Abro un socket a api.polygon.io:80, después escribo lo siguiente:
GET /v2/aggs/ticker/C:EURUSD/range/1/minute/2021-06-02/2021-06-03?unadjusted=true&sort=asc&limit=5000&apiKey=*
HTTP/1.1
Host: api.polygon.io
Connection: close

Que se supone que es lo que hace el navegador, pero me responde con lo siguiente:


<!DOCTYPE html>
<html>


<head>
<title>Polygon.io 404 Not Found</title>
<link rel="icon" href="images/favicon.png">
</head>


<style>
body {
font-family: Arial, Helvetica, sans-serif;
text-align: center;
}


h1 {
font-size: 2rem;
font-weight: 400;
line-height: 2.5rem;
margin: 1rem;
color: #363636;
}


p {
font-size: 1rem;
line-height: 1.5rem;
margin: 1rem;
color: #6b6b6b;
}


a {
color: #5F5CFF;
}


.container {
margin: 160px auto;
max-width: 440px;
padding: 16px;
}


.logo {
display: block;
/* padding-right: 32px; */
padding-bottom: 24px;
margin: 0 auto;
}
</style>


<body>


<div class="container">


<img class="logo"
src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGl uZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjc4cHgiIGhlaWdod D0iNDc4cHgiIHZpZXdCb3g9IjAgMCAyNzggNDc4IiB2ZXJzaW9 uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL 3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE 5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRja CA1NS4yICg3ODE4MSkgLSBodHRwczovL3NrZXRjaGFwcC5jb20 gLS0+CiAgICA8dGl0bGU+cG9seWdvbkxvZ288L3RpdGxlPgogI CAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiA gICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZ S13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmV ub2RkIj4KICAgICAgICA8ZyBpZD0iQXJ0Ym9hcmQiIHRyYW5zZ m9ybT0idHJhbnNsYXRlKC0xMjg3LjAwMDAwMCwgLTQyMy4wMDA wMDApIiBmaWxsPSIjMEEwQTBBIiBmaWxsLXJ1bGU9Im5vbnplc m8iPgogICAgICAgICAgICA8ZyBpZD0icG9seWdvbkxvZ28iIHR yYW5zZm9ybT0idHJhbnNsYXRlKDEyODcuMDAwMDAwLCA0MjMuM DAwMDAwKSI+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMjU zLjg4MDY5OSwxNDAuOTY1ODUzIEwxNDMuODMyMzE3LDMxLjAxN DQ1ODcgTDg3LjQzODg1MDUsMjYxLjAyNzE3IEwxMjkuNzc5ODQ 0LDM5My4zNDcxMSBMMTI5Ljc3OTg0NCwyOTEuOTc2MDUxIEwyN TMuODgwNjk5LDE0MC45NjU4NTMgWiBNMjE4LjU4NzQ5OCwyMTI uMDA3MzY5IEwxNDcuNjE0MjM5LDI5OC4zNzAwNzcgTDE0Ny42M TQyMzksNDAxLjI5MjIwOCBMMjE4LjU4NzQ5OCwyMTIuMDA3MzY 5IFogTTEyMi44ODgwNzMsNDEuNTQyMDA2MiBMMjIuNTM4NjU2N ywxNDEuMTgyMDk3IEw3NS4wNTA4OTczLDIzNi42NTYwNzIgTDE yMi44ODgwNzMsNDEuNTQyMDA2MiBaIE02OS41NjY2NDY4LDI2M y42OTU3ODQgTDAuNDI5NDk2MTIzLDEzNy45OTU1OTUgTDEzOC4 3MTY1ODIsMC42ODU5OTk2MDIgTDI3Ny44Mjk1NzIsMTM5LjY3N jM4NiBMMjUyLjk0ODM5OSwxNzEuMTY4MzI2IEwxMzguMDMwNjE 1LDQ3Ny42NTI2OTMgTDY5LjU2NjY0NjgsMjYzLjY5NTc4NCBaI iBpZD0iQ29tYmluZWQtU2hhcGUiPjwvcGF0aD4KICAgICAgICA gICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+"
width="96px" height="auto" />


<h1>404 Not Found</h1>
<p><strong>This route does not exist.</strong></p>
<p>Apologies for any inconvenience, we can't seem to find the page you are looking for.</p>
<!-- <p>For more information email <a href="mailto:support@polygon.io">support@polygon.io</a></p> -->
<hr>
<p>Go back to our website <a href="https://polygon.io">polygon.io</a></p>
<p>Go to API Docs <a href="https://polygon.io/docs/">Polygon API Docs</a></p>


</div>


</body>


</html>


¿Que me falta poner al hacer el GET ....? He estado buscando por internet pero no doy con la tecla.

Gracias de antebraso

swapd0
04/06/2021, 09:45
Si le quito la primera barra teniendo GET v2/... me da un 400 bad request...

Esto de ir dando palos de ciego... le he añadido mas tonterías al get como el campo User-Agent, Acept pero por ahi no van los tiros porque me dice que no encuentra la pagina, pero si hago un copy&paste y la pongo en el navegador si que va... WTF

juanvvc
04/06/2021, 10:52
Fíjate que si preguntas al puerto 80, te responde con una redirección obligatoria al protocolo https. Esa redirección la gestiona el navegador automáticamente, pero la gestiona también tu programa C++?



$ telnet api.polygon.io 80

(...)

GET /v2/aggs/ticker/C:EURUSD/range/1/minute/2021-06-02/2021-06-03?unadjusted=true&sort=asc&limit=5000&apiKey=* HTTP/1.1
Host: api.polygon.io
Connection: close

HTTP/1.1 308 Permanent Redirect
Server: nginx/1.19.2
Date: Fri, 04 Jun 2021 08:33:33 GMT
Content-Type: text/html
Content-Length: 171
Connection: keep-alive
Location: https://api.polygon.io/v2/aggs/ticker/C:EURUSD/range/1/minute/2021-06-02/2021-06-03?unadjusted=true&sort=asc&limit=5000&apiKey=*

<html>
<head><title>308 Permanent Redirect</title></head>
<body>
<center><h1>308 Permanent Redirect</h1></center>
<hr><center>nginx/1.19.2</center>
</body>
</html>
^CConnection closed by foreign host.


Si haces la petición directa al https da el error "401", que creo que es lo que esperas



$ openssl s_client -connect api.polygon.io:443

(....)

GET /v2/aggs/ticker/C:EURUSD/range/1/minute/2021-06-02/2021-06-03?unadjusted=true&sort=asc&limit=5000&apiKey=* HTTP/1.1
Host: api.polygon.io
Connection: close

HTTP/1.1 401 Unauthorized
Server: nginx/1.19.2
Date: Fri, 04 Jun 2021 08:35:28 GMT
Content-Type: application/json
Content-Length: 92
Connection: close
X-Request-Id: 407ec9cbd22bb3109cae43147072b989
Strict-Transport-Security: max-age=15724800; includeSubDomains

{"status":"ERROR","request_id":"407ec9cbd22bb3109cae43147072b989","error":"Unknown API Key"}closed


Una opción para que veas todas las peticiones y headers de cada una de ellas, incluyendo las redirecciones, es curl:



curl -Lsvo - 'http://api.polygon.io/v2/aggs/ticker/C:EURUSD/range/1/minute/2021-06-02/2021-06-03?unadjusted=true&sort=asc&limit=5000&apiKey=*'
(primero verás la petición al 80 y el anuncio de redirección)
(luego la gestión de la conexión ssl al 443)
(y finalmente la petición al 443)


-----Actualizado-----

Pero estoy pensando... ese error 404 no será porque la función de enviar que estés usando en C++ formatea de alguna manera la cadena "/v2/aggs/ticker/C:EURUSD/range/1/minute/2021-06-02/2021-06-03?unadjusted=true&sort=asc&limit=5000&apiKey=*" ? es decir, que cambie algún caracter o algo.

swapd0
04/06/2021, 11:51
No tengo telnet... cosas de apple, eso si, yo estaba "abriendo" un socket con ssl en el puerto 80 XD, internet no es mi campo. Pongo abriendo entre comillas porque mirando la documentación y los ejemplos lo estaba haciendo mal. Lo raro es que me dejase hacer lo que estaba haciendo, pero usar las boost (asio en este caso) hay veces que son un dolor de muelas.

A ver si lo cambio, pero veo que es muy distinto una conexión http normal a una https.

Lo de que me cambiara algo lo he pensado pero estoy metiendo el get en un std::string y después mando el buffer, antes de enviarlo lo saco por la consola y es lo que he copiado mas arriba.

juanvvc
04/06/2021, 13:19
https hace sus cosas por debajo antes y después de enviar, pero si estás usando una librerías tú ni te enteras. Según tu punto de vista, tú envías solo este texto y ya está. Es solo que la librería https que estés usando inicia sesión, negocia cifrado, ejecuta D-H y cifra. Pero para ti es transparente lo que haga, tú simplemente crees que estás enviando solamente esto. Si estás usando una librerías C++ para conexiones y no solo sockets "a pelo", prueba a conectarte con https al puerto 443 y no al 80



GET /v2/aggs/ticker/C:EURUSD/range/1/minute/2021-06-02/2021-06-03?unadjusted=true&sort=asc&limit=5000&apiKey=* HTTP/1.1
Host: api.polygon.io
Connection: close



-----Actualizado-----


No tengo telnet... cosas de apple, eso si, yo estaba "abriendo" un socket con ssl en el puerto 80

Ah. Puede que si intentas iniciar una conexión "SSL" (actualízate, ahora se llama TLS) en el puerto 80 el servidor se haga un lío y devuelva 404. Pero me extrañaría.

Sobre telnet en macos, obviamente, brew install telnet

swapd0
04/06/2021, 15:24
Por fin, ya he conseguido que funcione, con las boost::asio tenia que hacer todo mas a mano y no habia forma, al final he usado la librería boost::beast que tiene classes para hacer peticiones de get, post y cosas de esas.

Ahora toca limpiar el código que esta hecho una guarreria y despues a pasear el fichero json que me mandan.

juanvvc
04/06/2021, 15:28
Sí, es que usar sockets a pelo está bien como ejercicio cuando aprendes, pero para cualquier cosa seria es mejor confiar en librerías.

swapd0
27/02/2023, 18:12
Vuelvo a la carga.

Tengo una clase para hacer consultas al api.polygon.io y funciona, pero si hago la peticion para los datos de hoy me devuelve un DELAYED, eso pasa tambien si le pido los datos para toda esta semana, al parecer no le gusta que le pidas mas datos de los que tiene y te devuelve un DELAYED, ok.

Lo que no entiendo es que si pido los datos de hoy no va, pero si copio la consulta al navegador si que me devuelve los datos de hoy. WTF, no se que mete el navegador que hace que funcione y mi consulta no.

swapd0
27/02/2023, 19:20
By the way, estoy usando las boost::beast para las peticiones http, así me ahorro quebraderos de cabeza.

swapd0
27/02/2023, 22:47
Después de buscar por todas partes me he encontrado con esta libreria, https://github.com/RAvenGEr/simple-beast-client, que esta montada sobre las boost::beast, y haciendo un cambio cutre y rapido funciona, eso si, he tenido que ejecutar paso a paso porque me daba un "Error unsupported scheme." y para que funcionen las peticiones https tienes que tener definido un ENABLE_HTTPS que no viene en la documentación.

Un dia entero para esto XD.

josepzin
28/02/2023, 01:09
Pvta m1erda de tiempo perdido por una chorrada...!!

¿Una IA lo hubiese podido resolver? ahora mismo me lo pregunto esto... me siento como mi padre hace unos años con su profesión que lo dejó "obsoleto".

swapd0
28/02/2023, 09:58
Pues no se me ocurrió, lo malo es como plantear la pregunta para que "acierte" y que me tendría que registrar en chatGPT XD

selecter25
28/02/2023, 18:37
Pues no se me ocurrió, lo malo es como plantear la pregunta para que "acierte" y que me tendría que registrar en chatGPT XD

Cuenta google falsa y logueas con ella, así lo hago yo con todo y así uso yo ChatGPT.

Sin tener idea de cómo consumir esa API, le he preguntado, me ha dado indicaciones y me ha ofrecido una solución usando Python. Le he pedido si podía hacer lo mismo con C++ y me ha ofrecido esta solución usando curl:


Podrías indicarme cómo hacer lo mismo en C++?



Sí, por supuesto. Para hacer solicitudes a la API de Polygon en C++, necesitará utilizar una biblioteca que le permita interactuar con la API de manera efectiva. A continuación, le proporcionaré un ejemplo de cómo hacer una solicitud a la API de Polygon utilizando la biblioteca "curl" en C++ para obtener los datos del día actual sin que devuelva delayed:


#include <iostream>
#include <curl/curl.h>
#include <string>

int main() {
// Configuración de la conexión a la API
CURL* curl = curl_easy_init();
std::string url = "https://api.polygon.io/v2/snapshot/locale/us/markets/stocks/today?apiKey=<API KEY>";
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());

// Configuración de los parámetros de solicitud
struct curl_slist* headers = nullptr;
headers = curl_slist_append(headers, "Content-Type: application/json");
headers = curl_slist_append(headers, "Accept: application/json");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

// Realización de la solicitud
CURLcode res;
std::string response;
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, [](char* ptr, size_t size, size_t nmemb, void* userdata) -> size_t {
((std::string*)userdata)->append(ptr, size * nmemb);
return size * nmemb;
});
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
res = curl_easy_perform(curl);
curl_slist_free_all(headers);
curl_easy_cleanup(curl);

// Procesamiento de la respuesta
std::cout << "Response: " << response << std::endl;

return 0;
}



En este ejemplo, utilizamos la biblioteca "curl" para hacer una solicitud GET a la API de Polygon. Primero, configuramos la conexión a la API especificando la URL de solicitud y nuestra clave de API. Luego, configuramos los parámetros de la solicitud, como los encabezados de solicitud necesarios. Por último, realizamos la solicitud utilizando la función curl_easy_perform y procesamos la respuesta utilizando la biblioteca estándar de C++.

Es importante que tenga en cuenta que deberá reemplazar <API KEY> en la URL de solicitud con su propia clave de API de Polygon para que la solicitud funcione correctamente. Además, asegúrese de haber instalado la biblioteca "curl" en su sistema antes de compilar y ejecutar este código.