Question

Si je crée un HTTP java.net.URL puis appelle openConnection() dessus, cela implique-t-il nécessairement qu'une publication HTTP va avoir lieu ?Je sais que openStream() implique un GET.Si oui, comment exécuter l'un des autres verbes HTTP sans avoir à travailler avec la couche de socket brute ?

Était-ce utile?

La solution

Si vous récupérez le URLConnection objet utilisant openConnection() il ne commence pas réellement à communiquer avec le serveur.Cela n'arrive pas tant que vous n'avez pas reçu le flux du URLConnection().Lorsque vous obtenez la connexion pour la première fois, vous pouvez ajouter/modifier les en-têtes et autres propriétés de connexion avant de l'ouvrir.

Le cycle de vie d'URLConnection est un peu étrange.Il n'envoie pas les en-têtes au serveur tant que vous n'avez pas obtenu l'un des flux.Si vous obtenez simplement le flux d'entrée, je pense qu'il effectue un GET, envoie les en-têtes, puis vous permet de lire la sortie.Si vous obtenez le flux de sortie, je pense qu'il l'envoie sous forme de POST, car il suppose que vous y écrirez des données (vous devrez peut-être appeler setDoOutput(true) pour que le flux de sortie fonctionne).Dès que vous obtenez le flux d'entrée, le flux de sortie est fermé et attend la réponse du serveur.

Par exemple, cela devrait faire un POST :

URL myURL = new URL("http://example.com/my/path");
URLConnection conn = myURL.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);

OutputStream os = conn.getOutputStream();
os.write("Hi there!");
os.close();

InputStream is = conn.getInputStream();
// read stuff here

Alors que cela ferait un GET :

URL myURL = new URL("http://example.com/my/path");
URLConnection conn = myURL.openConnection();
conn.setDoOutput(false);
conn.setDoInput(true);

InputStream is = conn.getInputStream();
// read stuff here

URLConnection fera aussi d'autres choses bizarres.Si le serveur spécifie une longueur de contenu, alors URLConnection gardera le flux d'entrée sous-jacent ouvert jusqu'à ce qu'il reçoive autant de données, même si vous le fermez explicitement.Cela nous a causé beaucoup de problèmes car cela rendait un peu difficile l'arrêt propre de notre client, car le URLConnection garderait la connexion réseau ouverte.Cela existe probablement même si vous utilisez simplement getStream() cependant.

Autres conseils

Non.Mais si le protocole de l'URL est HTTP, vous obtiendrez un HttpURLConnection comme objet de retour.Cette classe a un setRequestMethod méthode pour spécifier la méthode HTTP que vous souhaitez utiliser.

Si vous souhaitez faire des choses plus sophistiquées, vous feriez probablement mieux d'utiliser une bibliothèque comme Client HTTP de Jakarta.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top