setrequestmethod http_ok example español ejemplo java inputstream httpurlconnection outputstream urlconnection

java - http_ok - ¿Puedes explicar el proceso de conexión HttpURLConnection?



urlconnection java ejemplo (4)

¿En qué punto HTTPURLConnection intenta establecer una conexión con la URL dada?

En el puerto nombrado en la URL, de lo contrario, 80 para HTTP y 443 para HTTPS. Yo creo que esto está documentado.

¿En qué punto puedo saber que pude establecer una conexión exitosamente?

Cuando llama a getInputStream () o getOutputStream () o getResponseCode () sin obtener una excepción.

¿Están estableciendo una conexión y enviando la solicitud real en un paso / llamada de método? ¿Qué método es?

No y ninguno

¿Puedes explicar la función de getOutputStream y getInputStream en el término de laico?

Cualquiera de ellos primero se conecta si es necesario, luego devuelve la transmisión requerida.

Observé que cuando el servidor al que trato de conectar está caído, recibo una excepción en getOutputStream. ¿Significa que HTTPURLConnection solo comenzará a establecer una conexión cuando invoque getOutputStream? ¿Qué tal el getInputStream? Dado que solo puedo obtener la respuesta en getInputStream, ¿significa que no he enviado ninguna solicitud en getOutputStream pero que simplemente establece una conexión? ¿Ha regresado HttpURLConnection al servidor para solicitar una respuesta cuando invoco getInputStream?

Véase más arriba.

¿Tengo razón al decir que OpenConnection simplemente crea un nuevo objeto de conexión pero aún no establece ninguna conexión?

Sí.

¿Cómo puedo medir la sobrecarga de lectura y conectar los gastos generales?

Conectar: ​​tómese el tiempo getInoutStream () o getOutputStream () tarda en regresar, lo que sea que llame primero. Lectura: tiempo desde el inicio de la primera lectura hasta la obtención del EOS.

Estoy usando HTTPURLConnection para conectarme a un servicio web. Sé cómo usar HTTPURLConnection pero quiero entender cómo funciona. Básicamente, quiero saber lo siguiente:

  • ¿En qué punto HTTPURLConnection intenta establecer una conexión con la URL dada?
  • ¿En qué punto puedo saber que pude establecer una conexión exitosamente?
  • ¿Están estableciendo una conexión y enviando la solicitud real en un paso / llamada de método? ¿Qué método es?
  • ¿Puedes explicar la función de getOutputStream y getInputStream en el término de laico? Observé que cuando el servidor al que trato de conectar está caído, recibo una Exception en getOutputStream . ¿Significa que HTTPURLConnection solo comenzará a establecer una conexión cuando invoque getOutputStream ? ¿Qué tal el getInputStream ? Dado que solo puedo obtener la respuesta en getInputStream , ¿significa que no he enviado ninguna solicitud en getOutputStream pero que simplemente establece una conexión? ¿ HttpURLConnection regresado HttpURLConnection al servidor para solicitar una respuesta cuando invoco getInputStream ?
  • ¿Tengo razón al decir que openConnection simplemente crea un nuevo objeto de conexión pero aún no establece ninguna conexión?
  • ¿Cómo puedo medir la sobrecarga de lectura y conectar los gastos generales?


¿En qué punto HTTPURLConnection intenta establecer una conexión con la URL dada?

Vale la pena aclarar, existe la instancia ''UrlConnection'' y luego está la conexión de socket Tcp / Ip / SSL subyacente, 2 conceptos diferentes. La instancia ''UrlConnection'' o ''HttpUrlConnection'' es sinónimo de una única solicitud de página HTTP y se crea cuando se llama a url.openConnection (). Pero si haces múltiples url.openConnection () de la instancia de una ''url'', entonces si tienes suerte, reutilizarán el mismo socket Tcp / Ip y el protocolo de enlace SSL ... lo cual es bueno si estás haciendo muchas solicitudes de página al mismo servidor, especialmente bueno si está usando SSL donde la sobrecarga de establecer el socket es muy alta.

Ver: Implementación de HttpURLConnection


String message = URLEncoder.encode("my message", "UTF-8"); try { // instantiate the URL object with the target URL of the resource to // request URL url = new URL("http://www.example.com/comment"); // instantiate the HttpURLConnection with the URL object - A new // connection is opened every time by calling the openConnection // method of the protocol handler for this URL. // 1. This is the point where the connection is opened. HttpURLConnection connection = (HttpURLConnection) url .openConnection(); // set connection output to true connection.setDoOutput(true); // instead of a GET, we''re going to send using method="POST" connection.setRequestMethod("POST"); // instantiate OutputStreamWriter using the output stream, returned // from getOutputStream, that writes to this connection. // 2. This is the point where you''ll know if the connection was // successfully established. If an I/O error occurs while creating // the output stream, you''ll see an IOException. OutputStreamWriter writer = new OutputStreamWriter( connection.getOutputStream()); // write data to the connection. This is data that you are sending // to the server // 3. No. Sending the data is conducted here. We established the // connection with getOutputStream writer.write("message=" + message); // Closes this output stream and releases any system resources // associated with this stream. At this point, we''ve sent all the // data. Only the outputStream is closed at this point, not the // actual connection writer.close(); // if there is a response code AND that response code is 200 OK, do // stuff in the first if block if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { // OK // otherwise, if any other status code is returned, or no status // code is returned, do stuff in the else block } else { // Server returned HTTP error code. } } catch (MalformedURLException e) { // ... } catch (IOException e) { // ... }

Las primeras 3 respuestas a sus preguntas se enumeran como comentarios en línea, junto a cada método, en el HTTP POST de ejemplo anterior.

De getOutputStream :

Devuelve una secuencia de salida que escribe en esta conexión.

Básicamente, creo que entiendes bien cómo funciona esto, así que permítanme reiterarlo en términos sencillos. getOutputStream básicamente abre una secuencia de conexión , con la intención de escribir datos en el servidor. En el ejemplo de código anterior, "mensaje" podría ser un comentario que estamos enviando al servidor que representa un comentario que queda en una publicación. Cuando ves getOutputStream , estás abriendo el flujo de conexión para escribir, pero en realidad no escribes ningún dato hasta que llamas a writer.write("message=" + message); .

De getInputStream() :

Devuelve una secuencia de entrada que lee desde esta conexión abierta. Se puede lanzar una excepción SocketTimeoutException al leer de la secuencia de entrada devuelta si el tiempo de espera de lectura expira antes de que los datos estén disponibles para lectura.

getInputStream hace lo contrario. Al igual que getOutputStream , también abre una secuencia de conexión , pero la intención es leer datos del servidor, no escribir en él. Si falla la conexión o la apertura del flujo, verá una SocketTimeoutException .

¿Qué tal el getInputStream? Dado que solo puedo obtener la respuesta en getInputStream, ¿significa que no he enviado ninguna solicitud en getOutputStream pero que simplemente establece una conexión?

Tenga en cuenta que enviar una solicitud y enviar datos son dos operaciones diferentes. Cuando invoca getOutputStream o getInputStream url.openConnection() , envía una solicitud al servidor para establecer una conexión. Se produce un apretón de manos cuando el servidor le devuelve un reconocimiento de que la conexión está establecida. Es entonces cuando estás preparado para enviar o recibir datos. Por lo tanto, no es necesario que llame a getOutputStream para establecer una conexión que abra una transmisión, a menos que su propósito para realizar la solicitud sea enviar datos.

En términos simples, hacer una solicitud getInputStream es el equivalente a hacer una llamada telefónica a la casa de un amigo para decir "Oye, ¿está bien si vengo y tomas prestado ese par de grips?" y su amigo establece el apretón de manos diciendo: "¡Claro, ven y tómalo". Luego, en ese punto, se establece la conexión, caminas hasta la casa de tu amigo, tocas la puerta, pides las mordazas y vuelves a tu casa.

Usar un ejemplo similar para getOutputStream implicaría llamar a su amigo y decir "Oye, tengo ese dinero que te debo, ¿puedo getOutputStream ?" Tu amigo, que necesita dinero y está enfermo por mucho tiempo, dice: "Claro, ven por ti bastardo barato". Entonces caminas a la casa de tu amigo y le "envías" el dinero. Él entonces te echa y tú caminas de regreso a tu casa.

Ahora, continuando con el ejemplo del profano, veamos algunas Excepciones. Si llamas a tu amigo y él no estaba en casa, podría ser un error de 500. Si llamaste y recibiste un mensaje de número desconectado porque tu amigo está cansado de que tomes prestado dinero todo el tiempo, esa es una página 404 que no se encuentra. Si su teléfono está muerto porque no pagó la factura, podría ser una excepción IOException. (NOTA: Esta sección puede no ser 100% correcta. Su intención es darle una idea general de lo que está sucediendo en términos simples).

Pregunta # 5:

Sí, tiene razón en que openConnection simplemente crea un nuevo objeto de conexión pero no lo establece. La conexión se establece cuando llamas a getInputStream o getOutputStream.

openConnection crea un nuevo objeto de conexión. Desde el URL.openConnection javadocs :

Se abre una nueva conexión cada vez llamando al método openConnection del controlador de protocolo para esta URL.

La conexión se establece cuando se llama a openConnection y se invoca InputStream, OutputStream o ambos al crear una instancia.

Pregunta # 6 :

Para medir la sobrecarga, generalmente envuelvo un código de temporización muy simple alrededor de todo el bloque de conexión, así:

long start = System.currentTimeMillis(); log.info("Time so far = " + new Long(System.currentTimeMillis() - start) ); // run the above example code here log.info("Total time to send/receive data = " + new Long(System.currentTimeMillis() - start) );

Estoy seguro de que hay métodos más avanzados para medir el tiempo de solicitud y la sobrecarga, pero esto generalmente es suficiente para mis necesidades.

Para obtener información sobre el cierre de conexiones, sobre el que no preguntó, consulte ¿ En Java cuándo se cierra una conexión de URL? .