web-dev-qa-db-fra.com

java.io.IOException: le serveur a renvoyé le code de réponse HTTP: 403 pour l'URL

Je souhaite télécharger le fichier mp3 à partir de l'URL: "http://upload13.music.qzone.soso.com/30671794.mp3", j'ai toujours eu Java.io.IOException: le serveur a renvoyé le code de réponse HTTP: 403 pour l'URL. Mais c'est ok quand ouvrir l'URL en utilisant le navigateur. Ci-dessous une partie de mon code:

BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
    URL url = new URL(link);

    URLConnection urlConn = url.openConnection();
    urlConn.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");

    String contentType = urlConn.getContentType();

    System.out.println("contentType:" + contentType);

    InputStream is = urlConn.getInputStream();
    bis = new BufferedInputStream(is, 4 * 1024);
    bos = new BufferedOutputStream(new FileOutputStream(
    fileName.toString()));​

Quelqu'un pourrait m'aider? Merci d'avance!

15
Adao

Au lieu d'utiliser URLConnection en Java, si vous utilisez HttpURLConnection, vous devriez pouvoir accéder à la page Web demandée à partir de Java. Essayez le code suivant: 

 HttpURLConnection httpcon = (HttpURLConnection) url.openConnection(); 
 httpcon.addRequestProperty("User-Agent", "Mozilla/4.76"); 

Un Java normal utilisant urlConnection ne sera pas accepté pour accéder à Internet. Pour accéder au navigateur, il devra effectuer une recherche sans l’exception HTTP response code : 403 for URL


EDIT (@Mordechai): Pas besoin de faire le casting, ajoutez simplement l'agent utilisateur.

24
Saratha

Le problème est donné par le code d'état. 403 signifie en fait "Interdit" et implique La demande a été refusée pour une raison que le serveur ne veut pas (ou n'a aucun moyen de) indiquer au client.

le problème se situe côté serveur.

4
arthur

Lorsque j'accède à l'URL avec mon navigateur, je reçois également le code 403. Vous êtes peut-être connecté au site avec votre navigateur?

Si c'est le cas, vous devez dupliquer le cookie à partir de votre navigateur et l'envoyer, peut-être même en faire plus pour répliquer la signature de votre navigateur si le site effectue des vérifications supplémentaires.

Vous pouvez définir le cookie en ajoutant:

urlConn.setRequestProperty("Cookie", "foo=bar"); 

Où foo = bar est la paire clé-valeur que vous trouverez lorsque vous localisez le cookie du site dans votre navigateur.

2
Alexander Sagen

Je voudrais également vérifier si le serveur où la ressource est localisée a une ACL ou similaire en place, nous venons de résoudre un problème de "Java.io.IOException: 403" de cette façon.

Il se trouve que les erreurs 403 sont très génériques et vous ne pouvez pas vraiment être sûr de la source car cela peut être n'importe quoi.

0
runlevel0