Pregunta

Si creo un HTTP java.net.URL y luego llamar openConnection() en él, ¿implica necesariamente que se realizará una publicación HTTP?Yo sé eso openStream() implica un GET.Si es así, ¿cómo se ejecuta uno de los otros verbos HTTP sin tener que trabajar con la capa de socket sin formato?

¿Fue útil?

Solución

Si recuperas el URLConnection objeto usando openConnection() en realidad no comienza a comunicarse con el servidor.Eso no sucede hasta que obtienes la transmisión del URLConnection().Cuando obtiene la conexión por primera vez, puede agregar/cambiar encabezados y otras propiedades de la conexión antes de abrirla.

El ciclo de vida de URLConnection es un poco extraño.No envía los encabezados al servidor hasta que haya obtenido una de las transmisiones.Si solo obtiene el flujo de entrada, creo que realiza un GET, envía los encabezados y luego le permite leer la salida.Si obtiene el flujo de salida, creo que lo envía como POST, ya que supone que le escribirá datos (es posible que deba llamar setDoOutput(true) para que funcione el flujo de salida).Tan pronto como obtiene el flujo de entrada, el flujo de salida se cierra y espera la respuesta del servidor.

Por ejemplo, esto debería hacer 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

Si bien esto haría 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 También hará otras cosas raras.Si el servidor especifica una longitud de contenido, entonces URLConnection mantendrá abierto el flujo de entrada subyacente hasta que reciba esa cantidad de datos, incluso si lo cierras explícitamente.Esto nos causó muchos problemas ya que hizo que cerrar nuestro cliente limpiamente fuera un poco difícil, ya que el URLConnection mantendría la conexión de red abierta.Probablemente esto exista incluso si solo usas getStream() aunque.

Otros consejos

No, no lo hace.Pero si el protocolo de la URL es HTTP, obtendrás un HttpURLConnection como objeto de devolución.Esta clase tiene una setRequestMethod método para especificar qué método HTTP desea utilizar.

Si quieres hacer cosas más sofisticadas, probablemente sea mejor que uses una biblioteca como Cliente Http de Yakarta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top