3.1. Phân tích Header

HTTP Server cung cấp một số lượng thông tin  đáng kể trong các header MIME trước mỗi đáp ứng. Thông tin trong các header MIME có thể bao gồm cơ chế mã hóa nội dung được sử dụng, ngày và giờ, chiều dài của nội dung được trả về bằng byte, ngày hết hạn của nội dung, ngày mà nội dung được sửa đổi lần cuối. Tuy nhiên, thông tin được gửi phụ thuộc vào server; một server nào đó gửi tất cả các thông tin này cho mỗi yêu cầu, các server khác gửi các thông tin nào đó, và một số ít server không gửi thông tin nào. Các phương thức của mục này cho phép ta truy vấn một URLConnection để tìm ra thông tin MIME nào mà server đã cung cấp.

Ngoài HTTP, rất ít giao thức sử dụng các header MIME. Khi viết lớp con của lớp URLConnection, thông thường cần phải nạp chồng các phương thức này sao cho chúng trả về các giá trị có ý nghĩa. Phần thông tin quan trọng nhất bạn có thể thiếu là kiểu nội dung MIME. URLConnection cung cấp một số phương thức tiện ích nào đó mà trợ giúp bạn đoán nhận ra kiểu nội dung, dựa trên tên file của nó hoặc một số byte đầu tiên của chính dữ liệu.

•  public String getContentType()
Phương thức trả về kiểu nội dung MIME của dữ liệu. Nó phụ thuộc vào web server gửi một header MIME tương ứng, bao gồm một kiểu nội dung xác thực. Nó không đưa ra ngoại lệ và trả về giá trị null nếu kiểu nội dung không có. text/htm sẽ là kiểu nội dung mà bạn thường xuyên gặp nhất khi kết nối với web server. Các kiểu nội dung phổ biến khác bao gồm: text/plain, image/gif, image/jpeg.

•  public int getContentLength()
Phương thức này cho ta biết nội dung có kích thước bao nhiêu byte. Rất nhiều server chỉ gửi các header độ dài nội dung khi chúng truyền một file nhị phân, chứ không phải khi truyền một file văn bản. Nếu không có chiều dài nội dung, phương thức getContentLength() trả về -1. Phương thức này không đưa ra ngoại lệ. Nó được sử dụng khi ta cần biết cần đọc bao nhiêu byte, hoặc khi ta cần tạo ra một buffer đủ lớn để lưu trữ dữ liệu.

•  public String getContentEncoding()
Phương thức này trả về String cho ta biết cách thức mã hóa. Nếu nội dung được gửi không được mã hóa (như trong trường hợp của HTTP server), phương thức này trả về giá trị null. Nó không đưa ra ngoại lệ.

•  public long getDate()
Phương thức getDate() trả về một số nguyên kiểu long cho bạn biết tài liệu  đã được gửi khi nào. Ta có thể chuyển đổi nó sang một đối tượng kiểu java.util.Date.
Ví dụ: Date docSent = new Date(uc.getDate());
Đây là thời gian tài liệu  được gửi trên server. Nếu header MIME không có một header Date.

•  public long getExpiration()

•  public long getLastModified()
Phương thức date, getLastModified(), trả về ngày mà tài liệu  được sửa  đổi lần cuối.
Ví dụ: Đọc các URL từ dòng lệnh, và sử dụng 6 phương thức để in ra kiểu nội dung, chiều dài nội dung, mã hóa nội dung, ngày sửa đổi cuối cùng, ngày hết hạn, và ngày hiện hành.

3.2. Tìm kiếm các trường Header MIME

Sáu phương thức cuối cùng đòi hỏi các trường nhất định từ header MIME, nhưng không có giới hạn nào về số các trường header mà một thông điệp MIME có thể có.  Năm phương thức tiếp theo kiểm tra các trường nhất định trong header MIME.

FileURLConnection không có các header MIME thực sự , vì vậy tất cả các phương thức này trả về giá trị null khi bạn đang làm việc với một file: URL, hành vi mặc định của chúng. HttpURLConnections tìm ra một trường header  để thỏa mãn yêu cầu của bạn. Nếu được tìm thấy, nó được trả về, ngược lại nó trả về giá trị null.

•  public String getHeaderField(String name)
Phương thức getHeaderField() trả về giá trị của trường header MIME được đặt tên. Tên của header không phân biệt chữ hoa và chữ thường và không chứa dấu kết thúc.
Ví dụ,  để tìm giá trị của các trường header Content-type, Content-encoding của một đối tượng URLConnection uc bạn có thể viết:

uc.getHeaderField(“content-type”);
uc.getHeaderField(“content-encoding”);

Để nhận thông tin về các trường Date, Content-length, hoặc Expiration bạn cũng thực hiện tương tự:

uc.getHeaderField(“date”);
uc.getHeaderField(“expires”);
uc.getHeaderField(“Content-length”);

Tất cả các phương thức này đều trả về các String, không phải int cũng không phải long như các phương thức getContentLength(); getExpirationDate(), getLastModified(), và getDate(). Nếu bạn quan tâm đến một giá trị số, bạn phải chuyển đổi String thành long hoặc int.

•  public String getHeaderFieldKey(int n)
Phương thức này trả về khóa (nghĩa là tên trường: ví dụ, Content-length hoặc Server) của trường header thứ n. Header đầu tiên là 0. Ví dụ, để nhận khóa thứ 6 của header MIME của URLConnection, bạn viết:

String header5=uc.getHeaderFieldKey(5);

•  public String getHeaderField(int n)
Phương thức này trả về giá trị trường header MIME thứ n. Header MIME đầu tiên là một.
Ví dụ: Sử dụng phương thức kết hợp với phương thức getHeaderFieldKey()để in ra header MIME.

•  public long getHeaderFieldDate(String name, long default)
Phương thức này trước hết tìm kiếm trường header được xác định bởi tham số name và cố gắng chuyển đổi xâu này sang kiểu long.

3.3. Các phương thức RequestProperty

Bốn phương thức sau không thực hiện bất kỳ công việc gì trong lớp cơ sở URLConnection, cũng không  được cài  đặt trong các lớp FileURLConnection hoặc HttpConnection. Bạn có thể mong muốn nạp chồng chúng trong một lớp con để cài đặt phương thức tra cứu bảng băm, chẳng hạn để xây dựng một bảng băm chứa tất cả các header MIME của yêu cầu.

•  public String getRequestProperty(String property_name)
Phương thức này đưa ra một ngoại lệ IllegalAccesError nếu liên kết là mở, ngược lại phương thức trả về giá trị null. Nếu bạn nạp chồng nó, các phương thức của bạn cần trả về giá trị gắn với một thuộc tính cho trước như là một xâu.

• public static void setDefaultRequestProperty(String property_name, String property_value) Phương thức này không thực hiện công việc gì. Nếu bạn nạp chồng phương thức này, bạn sẽ sử dụng nó để lưu trữ một giá trị mặc định cho thuộc tính cho trước.

•  public void setRequestProperty(String property_name, String property_value)
Phương thức này trả về ngoại lệ IllegalAccessError nếu liên kết đang mở. Ngược lại nó không thực hiện gì. Nếu bạn nạp chồng nó, bạn sẽ sử dụng nó để lưu trữ giá trị của một thuộc tính cho trước.

•  public String getDefaultRequest(String property_name)
Phương thức này luôn trả về giá trị null. Nếu bạn nạp chồng phương thức này, bạn cần trả về giá trị mặc định được gán cho một thuộc tính cho trước như là một String.

•  protected URLConnection(URL u)
Contructor trong URLConnection nhận một tham số là URL để thực hiện việc liên kết. Tất cả các tính chất khác của một URLConnection ban đầu được thiết lập là các giá trị mặc định của chúng và bạn có thể thay đổi chúng bằng tập các phương thức. Vì constructor có tính chất protected, chỉ có các đối tượng trong gói java.net mới có thể tạo ra một URLConnection. URLConnection là một lớp trừu tượng vì vậy bạn chỉ có thể gọi constructor của nó từ constructor của một trong các lớp con của nó.

Nếu bạn đang tạo ra lớp con của lớp URLConnection, bạn phải gọi constructor này trong dòng đầu của constructor của lớp con như sau:

myURLConnection(URL u) {
super(u);
}

Nếu bạn không đưa vào một lời gọi cụ thể tới constructor trong lớp con của bạn, Java cố gắng tạo ra một constructor không tham số của lớp cha: ví dụ URLConnection().

Vì lớp URLConnection không cung cấp các constructor không tham số, loại bỏ lời gọi cụ thể sẽ gây ra lỗi biên dịch.

3.4. Các trường và các phương thức có liên quan

Có mười ba trường trong lớp java.net. URLConnection. Bảy trường là các biến tĩnh định nghĩa các giá trị mặc định cho các thể hiện của lớp URLConnection. Sáu phương thức khác  định nghĩa trạng thái của một  đối tượng URLConnection cụ thể. Một vài phương thức get và set thay đổi các giá trị của chúng. Hầu hết các phương thức thiết lập các trường  đưa ra ngoại lệ IllegalAccessExceptions nếu bạn gọi chúng trong khi liên kết đang mở. Nhìn chung, bạn chỉ có thể thiết lập các thuộc tính của một đối tượng URLConnection trong khi liên kết đóng.

•  protected URL url

•  public URL getURL()

Trường url xác định URL mà URLConnection liên kết tới nó. Nó được thiết lập bởi constructor khi bạn tạo ra một URLConnection, và không cần thay đổi. Bạn có thể tìm kiếm giá trị bằng cách gọi phương thức getURL().

import java.net.*;
import java.io.IOException;

public class   printURLConnection{

public static void main(String[] args) {
URL u;
URLConnection uc;
try{
u = new URL(“http://www.ora.com/”);
try {
uc=u.openConnection();
System.out.println(uc.getURL());
} catch(IOException e) {
System.err.println(e);
}
} catch(MalformedURLException e) {
System.err.println(e);
}
}
}

•  protected boolean connected
Trường connected là đúng nếu liên kết là mở và là sai nếu liên kết đóng. Vì bạn không mở liên kết khi một đối tượng URLConnection được tạo ra, giá trị ban đầu của nó là false. Bạn chỉ có thể truy cập tới biến này thông qua các thể hiện của lớp URLConnection và các lớp con của nó. Không có các phương thức đọc hoặc thay đổi giá trị của nó. Khi viết một trình quản trị giao thức, bạn có nhiệm vụ thiết lập giá trị của biến này là true và thiết lập lại nó bằng giá trị false khi liên kết đóng. Rất nhiều phương thức trong gói java.net. URLConnection đọc biến này để xác định xem chúng có thể thực hiện việc gì. Nếu việc thiết lập không chính xác chương trình của bạn sẽ gặp các lỗi không dễ chuẩn đoán.

•  protected boolean allowUserInteraction

•  public void setAllowUserInteraction(boolean allowuserinteraction)

•  public boolean getAllowUserInteraction()
Một số URLConnection cần tương tác với người dùng. Ví dụ, một trình duyệt web có thể yêu cầu username và password. Tuy nhiên, rất nhiều ứng dụng không thể khẳng định một người sử dụng  đang có mặt  để tương tác với nó. Như ý nghĩa của tên, allowUserInteraction xác  định xem liệu tương tác người sử dụng có  được phép hay không. Ở chế độ mặc định nó được thiết lập là false. Vì biến này là protected, ta có thể sử dụng phương thức getAllowUserInteraction()để  đọc giá trị của nó và sử dụng phương thức setAllowUserInteraction()để thiết lập giá trị của nó. Giá trị true chỉ ra rằng tương tác với người sử dụng là được phép; giá trị false chỉ ra rằng không có tương tác với người dùng. Giá trị có thể được đọc ở bất kỳ thời điểm nào, nhưng nó chỉ có thể được thiết lập khi liên kết bị đóng. Gọi phương thức setAllowUserInteraction() khi liên kết mở sẽ đưa ra ngoại lệ IllegalAccessError (chứ không phải là IllegalAccessException). Các chương trình thường không đón bắt các lỗi (không giống như các ngoại lệ); một lỗi không được đón bắt thường buộc chương trình phải kết thúc.

Lập trình mạng trong JAVA(Phần 3)
Lập trình mạng trong JAVA(Phần 5)