Domanda

Se creo un file HTTP java.net.URL e poi chiama openConnection() su di esso, implica necessariamente che accadrà un post HTTP?So che openStream() implica un GET.In tal caso, come si esegue uno degli altri verbi HTTP senza dover lavorare con il livello socket grezzo?

È stato utile?

Soluzione

Se recuperi il URLConnection oggetto utilizzando openConnection() in realtà non inizia a comunicare con il server.Ciò non accade finché non ottieni lo streaming da URLConnection().Quando ottieni la connessione per la prima volta puoi aggiungere/modificare intestazioni e altre proprietà di connessione prima di aprirla effettivamente.

Il ciclo di vita di URLConnection è un po' strano.Non invia le intestazioni al server finché non hai ottenuto uno dei flussi.Se ottieni solo il flusso di input, credo che esegua un GET, invia le intestazioni, quindi ti consente di leggere l'output.Se ottieni il flusso di output, credo che lo invii come POST, poiché presuppone che scriverai dati su di esso (potresti dover chiamare setDoOutput(true) affinché il flusso di output funzioni).Non appena ricevi il flusso di input, il flusso di output viene chiuso e attende la risposta dal server.

Ad esempio, questo dovrebbe fare 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

Mentre questo farebbe 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 farà anche altre cose strane.Se il server specifica una lunghezza del contenuto, allora URLConnection manterrà aperto il flusso di input sottostante finché non riceverà così tanti dati, anche se lo chiudi esplicitamente.Ciò ci ha causato molti problemi poiché ha reso un po' difficile chiudere il nostro client in modo pulito, poiché il file URLConnection manterrebbe aperta la connessione di rete.Questo probabilmente probabilmente esiste anche se lo usi e basta getStream() Anche se.

Altri suggerimenti

No non lo fa.Ma se il protocollo dell'URL è HTTP, otterrai un file HttpURLConnection come oggetto di restituzione.Questa classe ha a setRequestMethod metodo per specificare quale metodo HTTP si desidera utilizzare.

Se vuoi fare cose più sofisticate probabilmente è meglio usare una libreria come Giakarta HttpClient.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top