web-dev-qa-db-fra.com

Aucune définition trouvée pour la table yahoo.finance.xchange

J'ai un service qui utilise un compte Yahoo! Table de finance yahoo.finance.xchange. Ce matin, j'ai remarqué que cela avait cessé de fonctionner parce que soudainement Yahoo! commencé à retourner une erreur en disant: 

{
    "error": {
    "lang": "en-US",
        "description": "No definition found for Table yahoo.finance.xchange"
    }
}

Ceci est l'URL de la demande . Fait intéressant: si j'essaie d'actualiser la requête plusieurs fois, je reçois parfois une réponse correcte, mais cela se produit très rarement (environ 10% du temps). Quelques jours auparavant, tout allait bien. 

Est-ce que cela signifie que l'API Yahoo est en panne ou est-ce qu'il me manque quelque chose parce que l'API a été modifiée? J'apprécierais toute aide.

12
DolceVita

Puisque j'ai le même problème et qu'il a commencé aujourd'hui aussi, que d'autres sont venus poster exactement au même moment, et que cela fonctionne encore la plupart du temps, la seule explication que je puisse trouver est qu'ils ont des erreurs de base de données aléatoires. sur leur fin et nous pouvons espérer que cela sera résolu bientôt. J'ai également un taux d'échecs de 20% lors de l'actualisation de la page de la requête.

J'imagine qu'ils utilisent plusieurs serveurs pour traiter les demandes (disons 8) et que l'un d'entre eux est vide ou n'a pas cette table pour certaines raisons. Ainsi, chaque fois que la requête est dirigée vers ce serveur, l'erreur est renvoyée.

Solution temporaire: Il suffit de modifier votre script pour réessayer 3-4 fois. Cela m’a fait parce qu’au moins une des cinq tentatives a réussi.

3
FlorianB

Je résous ce problème en utilisant quote.yahoo.com au lieu du service query.yahooapis.com. Voici mon code:

function devise($currency_from,$currency_to,$amount_from){
  $url = "http://quote.yahoo.com/d/quotes.csv?s=" . $currency_from . $currency_to . "=X" . "&f=l1&e=.csv";
  $handle  = fopen($url, "r");
  $exchange_rate = fread($handle, 2000);
  fclose($handle );
  $amount_to = $amount_from  * $exchange_rate;
  return round($amount_to,2);
}

EDIT ce qui précède ne fonctionne plus. À ce stade, oublions yahoo lol Utilisez ceci à la place

function convertCurrency($from, $to, $amount)    
{
    $url = file_get_contents('https://free.currencyconverterapi.com/api/v5/convert?q=' . $from . '_' . $to . '&compact=ultra');
    $json = json_decode($url, true);
    $rate = implode(" ",$json);
    $total = $rate * $amount;
    $rounded = round($total);
    return $total;
}
1
Patrick Simard

Même erreur, je migre vers http://finance.yahoo.com Voici un exemple en C #

private static readonly ILog Log = LogManager.GetCurrentClassLogger();
    private int YahooTimeOut = 4000;
    private int Try { get; set; }

    public decimal GetRate(string from, string to)
    {
        var url =
            string.Format(
                "http://finance.yahoo.com/d/quotes.csv?e=.csv&f=sl1d1t1&s={0}{1}=X", from, to);

        var request = (HttpWebRequest)WebRequest.Create(url);
        request.UseDefaultCredentials = true;
        request.ContentType = "text/csv";
        request.Timeout = YahooTimeOut;
        try
        {
            using (var response = (HttpWebResponse)request.GetResponse())
            {
                var resStream = response.GetResponseStream();
                using (var reader = new StreamReader(resStream))
                {
                    var html = reader.ReadToEnd();
                    var values = Regex.Split(html, ",");
                    var rate = Convert.ToDecimal(values[1], new CultureInfo("en-US"));
                    if (rate == 0)
                    {
                        Thread.Sleep(550);
                        ++Try;
                        return Try < 5 ? GetRate(from, to) : 0;
                    }
                    return rate;

                }
            }
        }
        catch (Exception ex)
        {
            Log.Warning("Get currency rate from Yahoo fail " + ex);
            Thread.Sleep(550);
            ++Try;
            return Try < 5 ? GetRate(from, to) : 0;
        }
    }
0
Dmitry Litus