La nouvelle URL (…) .openConnection () implique-t-elle nécessairement un POST?

Si je crée un java.net.URL HTTP et que j’appelle ensuite openConnection() , cela implique-t-il nécessairement qu’une publication HTTP se produira? Je sais que openStream() implique un GET. Si c’est le cas, comment effectuez-vous l’un des autres verbes HTTP sans avoir à travailler avec la couche de socket brute?

Si vous récupérez l’object URLConnection aide de openConnection() communication avec le serveur ne démarre pas. Cela ne se produit pas tant que vous n’avez pas reçu le stream de la part de URLConnection() Lorsque vous établissez la connexion pour la première fois, vous pouvez append / modifier des en-têtes et d’autres propriétés de connexion avant de l’ouvrir réellement.

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 reçu l’un des stream. Si vous n’obtenez que le stream d’entrée, alors je pense qu’il effectue un GET, envoie les en-têtes, puis vous permet de lire le résultat. Si vous obtenez le stream de sortie, je pense qu’il l’envoie sous forme de POST, car il suppose que vous y écrivez des données (vous devrez peut-être appeler setDoOutput(true) pour que le stream de sortie fonctionne). Dès que vous obtenez le stream d’entrée, le stream de sortie est fermé et il 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 également d’autres choses étranges. Si le serveur spécifie une longueur de contenu, URLConnection maintiendra le stream d’entrée sous-jacent jusqu’à ce qu’il reçoive autant de données, même si vous le fermez explicitement . Cela nous a posé beaucoup de problèmes car il a été un peu difficile de fermer notre client proprement, car URLConnection maintiendrait la connexion réseau ouverte. Cela existe probablement même si vous utilisez simplement getStream() .

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

Si vous voulez faire des choses plus sophistiquées, vous feriez probablement mieux d’utiliser une bibliothèque comme Jakarta HttpClient .