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) {
// ...
}
Sorularınızın ilk 3 yanıtı, yukarıdaki örnek HTTP POST'unda her yöntemin yanında satır içi yorumlar olarak listelenmiştir.
Gönderen getOutputStream :
Bu bağlantıya yazan bir çıkış akışı döndürür.
Temel olarak, bunun nasıl çalıştığını iyi anladığınızı düşünüyorum, bu yüzden layman'ın terimleriyle tekrar edeyim. getOutputStream
temel olarak veriyi sunucuya yazmak amacıyla bir bağlantı akışı açar . Yukarıdaki kod örneğinde "ileti", sunucuya gönderdiğimiz ve bir yayında kalan yorumu temsil eden bir yorum olabilir. Gördüğünüzde getOutputStream
, bağlantı akışını yazmak için açıyorsunuz , ancak arama yapana kadar hiçbir veri yazmıyorsunuz writer.write("message=" + message);
.
Gönderen ) (getInputStream :
Bu açık bağlantıdan okunan bir girdi akışı döndürür. Veriler okunabilir duruma gelmeden önce okuma zaman aşımı süresi doluyorsa, döndürülen giriş akışından okuma yapılırken bir SocketTimeoutException bildirilebilir.
getInputStream
tam tersini yapar. Gibi getOutputStream
, aynı zamanda bir bağlantı akışı açar , ancak amaç sunucuya veri okumak, ona yazmak değil. Bağlantı veya akış açma başarısız olursa, bir SocketTimeoutException
.
GetInputStream'e ne dersiniz? Sadece getInputStream'de yanıt alabildiğim için, henüz getOutputStream'de herhangi bir istek göndermediğim, ancak sadece bir bağlantı kurduğum anlamına mı geliyor?
Bir istek göndermenin ve veri göndermenin iki farklı işlem olduğunu unutmayın. GetOutputStream veya getInputStream öğelerini çağırdığınızda url.openConnection()
, sunucuya bağlantı kurmak için bir istek gönderirsiniz. Sunucunun size bağlantının kurulduğunu onayladığı bir el sıkışma vardır. O zaman, veri göndermeye veya almaya hazırsınız. Bu nedenle, istek yapma amacınız veri göndermek olmadıkça, bir akış açmak üzere bağlantı kurmak için getOutputStream öğesini çağırmanız gerekmez .
Layman'ın şartlarına göre, bir getInputStream
istekte bulunmak, arkadaşınızın evine "Hey, gelip bu çift mengene tutamacını ödünç almamın bir sakıncası yok mu?" ve arkadaşınız "Tabii! Gel ve al" diyerek el sıkışmasını kurar. Sonra, o noktada, bağlantı yapılır, arkadaşınızın evine yürür, kapıya vurur, mengene tutamaklarını talep eder ve evinize geri dönersiniz.
Benzer bir örnek kullanmak getOutputStream
, arkadaşınızı aramak ve "Hey, size borçlu olduğum param var, size gönderebilir miyim?" Demeyi içerir. İçinde para ve hastaya ihtiyaç duyan arkadaşınız, bunu çok uzun süre tuttuğunuzda, "Tabii, ucuz piçin üzerine gelin" diyor. Yani arkadaşınızın evine yürüyün ve ona parayı "POST". Sonra seni dışarı atıyor ve sen evine geri dönüyorsun.
Şimdi, layman örneğiyle devam edelim, bazı İstisnalara bakalım. Arkadaşınızı aradıysanız ve o evde değilse, bu 500 hata olabilir. Arkadaşınız her zaman para ödünç almaktan yorulduğundan bağlantı kesilmiş bir numara mesajı aradıysanız ve aldıysanız, bu bir 404 sayfası bulunamadı. Faturayı ödemediğiniz için telefonunuz öldüyse, bu bir IOException olabilir. (NOT: Bu bölüm% 100 doğru olmayabilir. Layman'ın terimleriyle ilgili genel bir fikir vermeniz amaçlanmıştır.)
Soru # 5:
Evet, openConnection uygulamasının yeni bir bağlantı nesnesi oluşturduğunu, ancak onu oluşturmadığını haklıyorsunuz. Bağlantı, getInputStream veya getOutputStream öğesini çağırdığınızda kurulur.
openConnection
yeni bir bağlantı nesnesi oluşturur. Gönderen URL.openConnection javadocs :
Bu URL için protokol işleyicisinin openConnection yöntemi çağrılarak her seferinde yeni bir bağlantı açılır.
OpenConnection'ı çağırdığınızda bağlantı kurulur ve bunları başlatırken InputStream, OutputStream veya her ikisi de çağrılır.
Soru # 6 :
Tepegöz ölçmek için, genel olarak tüm bağlantı bloğu etrafında bazı çok basit zamanlama kodu sarın, şöyle:
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) );
Eminim istek zamanı ve ek yükü ölçmek için daha gelişmiş yöntemler vardır, ancak bu genellikle ihtiyaçlarım için yeterlidir.
Sormadığınız bağlantıları kapatma hakkında bilgi için bkz . Bir URL bağlantısı ne zaman kapanıyor ? Java'da? .