Castrogiovanni20 / api-dolar-argentina

API para obtener la cotización de los diferentes tipos de dolar y riesgo país en tiempo real.
https://api-dolar-argentina.herokuapp.com/
275 stars 54 forks source link

Error al hacer get request al sitio de heroku #9

Closed fmarz96 closed 2 years ago

fmarz96 commented 3 years ago

Hola @Castrogiovanni20 @guidospadavecchia ! Cómo va? Tengo que hacer, para un sitio web que estoy desarrollando, conversión de dólares a pesos. Es por ello que estoy decidido a usar esta api. No la tengo muy clara con interacción con APIs. Mientras vayan leyendo, se irán dando cuenta. Dado que quiero hacer get de ajax a https://api-dolar-argentina.herokuapp.com/api/dolaroficial, quería consultarles si piensan dar de baja en algún momento el sitio en heroku o cómo puedo hacer yo para que, si ustedes lo dan de baja, el sitio que estoy haciendo pueda seguir andando sin problemas. Mi última pregunta es por cursos o enlaces que tengan para mejorar mis conocimientos de JS, y de distintos/as frameworks o librerías(React, Node, Express, ES6, etc). Para seguir aprendiendo.

UPDATE: Estoy haciendo get request a la url que está arriba. Mi problema es que me aparece este error en consola: Access to XMLHttpRequest at 'https://api-dolar-argentina.herokuapp.com/api/dolaroficial' from origin has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

El código que estoy usando para hacer la request es el siguiente:

$.ajax({ url: "https://api-dolar-argentina.herokuapp.com/api/dolaroficial", type: "GET", dataType: "json", contentType: 'application/json', success: function(data) { console.log(data); } });

Alguna idea de lo que podría estar pasando? Lo estoy probando local primero, pero también probé en Codepen y JSFiddle.

Muchas gracias por todo! Saludos.

Castrogiovanni20 commented 3 years ago

Hola Franco, ¿cómo estas?

Perdon la demora en responder, recien veo el issue. Sabes que otra persona también tuvo problemas para hacer peticiones a la API desde AJAX (https://github.com/Castrogiovanni20/api-dolar-argentina/issues/5). Actualmente la API es consumida de diferentes backend hechos en JavaScript, Java, PHP, C++ y en el único caso que rechaza las peticiones es con AJAX, es raro. Yo había hecho algunas modificaciones para permitir CORS, pero no funcionó. Voy a seguir investigando para ver si lo puedo solucionar. Te mantengo al tanto.

Con respecto a si el servidor se da de baja o hay algún problema, lo que podrias hacer es consumir el siguiente XML: https://www.dolarsi.com/api/dolarSiInfo.xml

Sobre los cursos de JS te recomiendo las webs:

Gracias!

Ramiro

fmarz96 commented 3 years ago

Hola!

Ya vi el mail pero me parece que corresponde seguir por acá. Había visto el otro issue, y ese fue el código que utilicé de base para armar mi request. Yo, en particular, tengo mi front con jQuery y Vue, y el backend lo tengo en Laravel. Por otro lado, te agradezco por pasar el xml, y por los links de los cursos!

Gracias a vos! Franco.

fmarz96 commented 3 years ago

Hola!

Al final pude resolverlo, pero usando PHP. Te paso el código que usé, quizás sirve para alguna otra oportunidad.

$responseHeroku = Http::get('https://api-dolar-argentina.herokuapp.com/api/dolaroficial'); if($responseHeroku->successful()){ $dolarOficialVenta = $responseHeroku['venta']; } else { $guzzleClient = new Client(); $response = $guzzleClient->get('https://www.dolarsi.com/api/dolarSiInfo.xml'); $body = $response->getBody(); $body->seek(0); $size = $body->getSize(); $file = $body->read($size); $xml = simplexml_load_string($file); $json = json_encode($xml); $array = json_decode($json, TRUE); $dolarOficial = $array["Dolar"]["casa344"]; $dolarOficialVenta = $dolarOficial["venta"]; }

Muchas gracias por desarrollar la api. Saludos! Franco.

Castrogiovanni20 commented 3 years ago

@fmarziano96 buenisimo! Yo sigo viendo como permitir peticiones de Ajax. Aviso cualquier novedad.

Saludos!

OscarZalazar commented 3 years ago

Buenos días! vengo siguiendo este proyecto y estoy muy interesado. sinceramente tengo 0 de programación. quisiera usarlo en el header de un WORDPRESS.

es muy difícil poder implementarlo sin ser programador en un sitio web este proyecto?

kevinvarela commented 3 years ago

@Castrogiovanni20 Buenas, para solucionas problemas de CORS en tus consumidores. Deberias responder el header Access-Control-Allow-Origin : * desde el server y los browsers dejarian de chillar. Saludos

Castrogiovanni20 commented 3 years ago

Gracias por la data @kevinvarela! Lo voy a agregar. Abrazo

delbit commented 3 years ago

Hola, conseguí la solución al error del cors. primero agregue la npm cors

y cambie el file index .js que primero este el cors y luego el router

`const express = require('express') const helmet = require('helmet') const bodyParser = require('body-parser') const cors = require('cors') const router = require('./routes/router') const PORT = process.env.PORT || 7070 const app = express();

app.get('/', async (req, res) => { try { res.send("API para obtener las cotizaciones de los distintos tipos de dolar y riesgo pais. La documentacion la podes encontrar en https://github.com/Castrogiovanni20/api-dolar-argentina") } catch(e) { console.log(e) res.send(500); } })

// Settings app.set('port', PORT);

app.use(helmet()) app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json());

// Configurar cabeceras y cors app.use(cors({ origin: '*' }));

// change route app.use('/', router)

// Starting the server app.listen(app.get('port'), () => { console.log('Server running on port ' + PORT) });`

Castrogiovanni20 commented 3 years ago

Gracias @delbit!

delbit commented 3 years ago

De nada, los que si note es que solo funciona con $.getJson para javascript, pero ya no da errores de CORS. Saludos.

kabeza commented 3 years ago

Caaaaaaaaaaapos ambos @Castrogiovanni20 y @delbit Justo estoy haciendo un curso de React/Node/Express y me viene increible el proyecto Gracias !!

daptee commented 2 years ago

Buenas! perdon que re abra este hilo. Yo estoy intentando hacer uso de la API en un proyecto hecho en VUE, y las peticiones por AXIOS, pero me esta dando tambien error de CORS. De lado de cliente como se puede solventar este tema?

Gracias!

delbit commented 2 years ago

Buenas! perdon que re abra este hilo. Yo estoy intentando hacer uso de la API en un proyecto hecho en VUE, y las peticiones por AXIOS, pero me esta dando tambien error de CORS. De lado de cliente como se puede solventar este tema?

Gracias!

Prueba a ver si con esta copia con la modificación te funciona, subo el repo para que puedas hacer un fork. https://apiarg.herokuapp.com/api/

daptee commented 2 years ago

Funciono esta URL que me dejaste perfectamente. Esta url estará siempre activa o hay que pasarla a otro lado? Asi como me la pasaste reemplace y me trajo lo datos perfectamente sin haber error de CORS.

delbit commented 2 years ago

Funciono esta URL que me dejaste perfectamente. Esta url estará siempre activa o hay que pasarla a otro lado? Asi como me la pasaste reemplace y me trajo lo datos perfectamente sin haber error de CORS.

Hasta ahora no la he dado de baja, pero es un heroku free así que no se si se caiga en algún momento. En mi repo subí el fork con la corrección, seria cuestion de deploy en tu heroku.

walopper commented 2 years ago

Si sirve de ayuda, esto es un pequeñisimo api gateway para poder hacer consultas XHR a la api de dolarsi.com sin problema de CORS:

Endpoint GET https://walo.in/dolar.php

Ejemplo:

const valoresDolar = fetch('https://walo.in/dolar.php')
    .then(r => r.json());

Ejemplo de response:

[
    {
        "casa": {
            "compra": "103,22",
            "venta": "109,22",
            "agencia": "349",
            "nombre": "Dolar Oficial",
            "variacion": "0,10",
            "ventaCero": "TRUE",
            "decimales": "2"
        }
    },
    {
        "casa": {
            "compra": "206,00",
            "venta": "209,00",
            "agencia": "310",
            "nombre": "Dolar Blue",
            "variacion": "-0,24",
            "ventaCero": "TRUE",
            "decimales": "2"
        }
    },
    {
        "casa": {
            "compra": "No Cotiza",
            "venta": "0",
            "agencia": "311",
            "nombre": "Dolar Soja",
            "variacion": "0",
            "ventaCero": "TRUE",
            "decimales": "3"
        }
    },
    {
        "casa": {
            "compra": "195,45",
            "venta": "212,88",
            "agencia": "312",
            "nombre": "Dolar Contado con Liqui",
            "variacion": "2,49",
            "ventaCero": "TRUE",
            "decimales": "2"
        }
    },
    {
        "casa": {
            "compra": "200,610",
            "venta": "200,090",
            "agencia": "313",
            "nombre": "Dolar Bolsa",
            "variacion": "0,170",
            "ventaCero": "TRUE",
            "decimales": "3"
        }
    },
    {
        "casa": {
            "compra": "9.852,070",
            "venta": "0",
            "agencia": "399",
            "nombre": "Bitcoin",
            "variacion": "-100,00",
            "ventaCero": "TRUE",
            "decimales": "3"
        }
    },
    {
        "casa": {
            "nombre": "Dolar turista",
            "compra": "No Cotiza",
            "venta": "180,21",
            "agencia": "406",
            "variacion": "0,10",
            "ventaCero": "TRUE",
            "decimales": "2"
        }
    },
    {
        "casa": {
            "compra": "102,57",
            "venta": "110,11",
            "agencia": "302",
            "nombre": "Dolar",
            "decimales": "3"
        }
    },
    {
        "casa": {
            "nombre": "Argentina",
            "compra": "1.888,00",
            "venta": "1,29",
            "mejor_compra": "True",
            "mejor_venta": "False",
            "fecha": "05\/05\/15",
            "recorrido": "16:30",
            "afluencia": {},
            "agencia": "141",
            "observaciones": {}
        }
    }
]

Codigo fuente de ese script:

<?php

if (array_key_exists('HTTP_ORIGIN', $_SERVER)) {
    $origin = $_SERVER['HTTP_ORIGIN'];
} else if (array_key_exists('HTTP_REFERER', $_SERVER)) {
    $origin = $_SERVER['HTTP_REFERER'];
} else {
    $origin = $_SERVER['REMOTE_ADDR'];
}

header("Content-type: application/json");
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Headers: Authorization, Origin, X-Requested-With, Content-Type, Accept, X-Origen");
header("Access-Control-Allow-Origin: " . $origin);

$arrContextOptions=array(
    "ssl"=>array(
        "verify_peer"=>false,
        "verify_peer_name"=>false,
    ),
);  

echo file_get_contents('https://www.dolarsi.com/api/api.php?type=valoresprincipales', false, stream_context_create($arrContextOptions));