Bonjour tous le monde,

J'essaye de récupérer des informations via une url. Mais je suis confonté a une erreur de CORS.
voici ma requête :

this.http.get('http://itunes.apple.com/lookup?id=xxxxxxxxxxxxx').catch(err => {
          this.logger.addLog("err", "api-provider", "GetInformationItunes", err.status + " : " + err.statusText + " ( " + JSON.stringify(err) + " )");
          return Observable.of(err);
        }).subscribe(data => {
          this.notify.nofifySuccess(data);
            if (data.ok) {
              data = data.json();
              let versionApp = this.parseVersion(versionAppParam);
              let versionStore = this.parseVersion(data['results'][0].version);
              this.storage.get('mobile_version_max').then(mobileVersion => {
                let versionMax = this.parseVersion(mobileVersion);
                let resultat = (versionStore > versionApp && versionStore <= versionMax)
                obs.next(resultat);
                obs.complete();
              })
            }
        });

dans les logs d'angular j'obtiens :

Object { _body: error, status: 200, statusText: "Ok", headers: Object, type: 3, url: null }

Comment je peux faire en sorte de ne plus avoir cette erreur ? :/
Merci :)

11 réponses


Defy
Réponse acceptée

c'est normale! Le cross domaine n'est pas autoriser sur les server d'apple! donc tu ne peut pas faire d'appel dessus depuis ton app mobile, tu doit obligatoirement passer pas du serveur!! ca fait quand plusieur fois qu'on t'aide pour se sujet et a chaque fois on te repond c'est coté server c'est qu'il y a une raison. SIi c'est pas possible coté mobile c'est pas possible, tu peut t'acharner tant que tu veut ca ne changera pas

je pense que tu ne peut pas non plus, ton domaine doit etre référencé dans les acces autorisé sur les server d'apple, je pense donc que c'est mort aussi de ce coté sauf si apple permet de référencer ses domaine pour acceder a leur server.

Il dois bien y avoir une solution, j'arrive à accéder aux données avec postman, même juste en allant consulter l'adresse qui me donne un fichier text. Il dois bien exister une solution pour le faire. :(

Le CORS c'est une restriction dans les navigateurs, ça devrait marcher depuis ton serveur avec Curl

J'utilise pas un serveur, c'est avec une application sous ionic. et quand j'essaye d'accéder à l'URL avec l'application buildé sur un smartphone android je n'accède pas aux données.

Je suis désolé de t'énerver Defy ^^ c'est pas mon but ^^.
Le truc qui me fait dire que c'est possible c'est que voilà comment ça se passe :
faire le http.get sur l'adresse direct cross domain, ça d'accord. En recherchant je tombe sur une solution : https://blog.ionicframework.com/handling-cors-issues-in-ionic/

Qui fonctionne mais me retourne un résultat "vide", quand je dis "résultat vide" c'est que j'ai un flux JSON de Itunes en retour mais qui me donne rien du tout, comme si je n'avais pas spécifié d'ID dans la requète ou un mauvais ID:

{
resultCount: 0,
results: [ ]
}

Je pense pas que se soit un soucis de cross domain ça, si ?
j'essaye même avec une page php qui fait un file_get_content() qui renvoi bien les informations, mais quand l'application y accède j'obtiens encore le même résultat "vide".

Parce que PHP c'est côté serveur.

Pour ton résultat vide, tu le fais sur quelle url de itunes ?

sur cette URL : http://itunes.apple.com/lookup?id=xxxxxxxxxx
après par rapport à ta réponse, je ne le fais pas que avec une page PHP, je fais un proxie sur ionic et ça fonctionne aussi mais j'ai le résultat vide.
En fait pour essayer d'être le plus clair possible sur chaque étape pour être sur de ne rien rater :

avec ionic :

http.get('http://itunes.apple.com/lookup?id=xxxxxxxxxx')

erreur de cross domain donc je passe sur un proxy :

dans le ionic.config.json 
"proxies": [
    {
      "path": "/api",
      "proxyUrl": "http://itunes.apple.com/lookup?id=xxxxxxxxxx"
    }
  ]

fonctionne mais renvoi le résultat dis vide

avec PHP :

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "http://itunes.apple.com/lookup?id=xxxxxxxxxx",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => array(
    "Cache-Control: no-cache",
    "Postman-Token: 37b47e84-56e0-474f-aa90-64ce689f88d5"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}

renvoi bien le flux JSON avec des données lorsque j'y accède via mon navigateur
Donc avec ionic je cible cette page là avec le proxy car sinon j'ai encore une erreur de cross domain par rapport à l'adresse de l'API.

Et là résultat vide alors que pourtant j'ai bien les données qui sont renvoyées via mon navigateur.

C'est ce que j'ai fais jimibi, mais avec une build on s'est rendu compte que je n'obtenez pas les données quand même.

J'avais essayé mais ca ne changeais rien, je viens de repartir sur une nouvelle base ca a l'air de fonctionner avec ce que j'avais fait, je vous tiens au courant :)

Bon je clos le sujet la seule solution qui fonctionne ne correspond pas à l'entreprise donc ils laissent tomber.
Merci à tous pour l'aide en tout cas.