Ví dụ HTTP POST
HTTP POST cho phép gởi dữ liệu đến server. Dữ liệu gởi đến server qua phương thức
GET chỉ giới hạn là dữ liệu chứa địa chỉ URL. Phương thức POST cho phép gởi một
luồng byte đến server. Phương thức HTTP POST thực hiện theo cách tương tự với
phương thức HTTP GET.
Ví dụ thực hiện một kết nối HTTP POST:
void getViaHttpConnection(String url) throws IOException {
HttpConnection c = null; InputStream is = null;
OutputStream os;
try {
c = (HttpConnection)Connector.open(url); // Mở kết nối
// Thiết lập phương thức POST
// trong khi vẫn ở trạng thái Thiết lập
c.setRequestMethod(HttpConnection.POST);
// Mở luồng output stream và chuyển sang trạng thái Kết nối
os = c.openOutputStream();
// Chuyển đổi dữ liệu thành luồng byte
// và gởi đến server
os.write(“Data Sent to Server\n”.getBytes());
int status = c.getResponseCode();
// Kiểm tra status
if (status != HttpConnection.HTTP_OK) throw new IOException(“not OK”);
int len = (int)c.getLength();
// Giống như ví dụ HTTP GET:
// Kiểm tra length và xử lý tương ứng
} finally {
// Đóng kết nối giống như ví dụ HTTP GET
}
}
Như ví dụ trước, phương thức postViaHttpConnection() nhận tham số đầu vào là một
chuỗi là địa chỉ URL được chuyển đến phương thức open() của lớp Connection.
Phương thức open() trả về một đối tượng Connection đóng vai trò là một lớp
HttpConnection. Kết nối bây giờ ở trong trạng thái thiết lập và phương thức yêu cầu được đặt là POST
bằng phương thức setRequestMethod(). Tất cả các thuộc tính khác phải được thiết
lập trong trạng thái này.
Phương thức openOutputStream() sẽ làm cho kết nối chuyển sang trạng thái Kết nối.
Phương thức write() và flush() sẽ gởi dữ liệu đến server.
Đoạn mã còn lại giống như phương thức GET. Luồng input được mở, chiều dài của dữ
liệu được kiểm tra, và dữ liệu được đọc toàn bộ khối hay từng ký tự một tùy vào
chiều dài được trả về. Khối lệnh cuối cùng sẽ đóng kết nối.
1.6 Triệu gọi CGI script
Cả hai phương thức GET và POST có thể được dùng để triệu gọi CGI script (Common
Gateway Interface script) và cung cấp dữ liệu nhập. Ví dụ, một MIDlet có một form
cho người dùng điền dữ liệu, sau đó có thể gởi dữ liệu kết quả cho server để CGI
script xử lý. CGI script có thể được triệu gọi giống như phương thức GET và POST.
Tên của CGI script và dữ liệu tham số nhập có thể chuyển trong địa chỉ URL. Nếu cần
gởi thêm dữ liệu cho server, thì có thể dùng phương thức POST.
Ví dụ các tham số được gởi là một phần của URL:
url = http://www.asite.com/cgi-bin/getloca...=abc&zip=12345
Trong ví dụ trên, địa chỉ URL có thể được chuyển như là một tham số giống như
phương thức getViaHttpConnection() ở ví dụ trước.
MA dựa trên khung kết nối mạng tổng quát (GCF).
Các tin nhắn được gởi và nhận với WMA được gởi trên các mạng không dây của điện
thoại di động và các thiết bị tương tự khác, có thể là GSM hay CDMA. WMA hỗ trợ
Short Message Service (SMS) và Cell Broadcast Short Message Service (CBS). Mặc
dù tin nhắn WMA tương tự như datagram, WMA không sử dụng giao diện datagram
được định nghĩa bởi GCF, giao diện này dùng cho kết nối UDP. Thay vào đó, WMA
định nghĩa một tập giao diện mới trong gói java.wireless.messaging.
ĐWMA dựa trên khung kết nối mạng tổng quát (GCF).
Các tin nhắn được gởi và nhận với WMA được gởi trên các mạng không dây của điện
thoại di động và các thiết bị tương tự khác, có thể là GSM hay CDMA. WMA hỗ trợ
Short Message Service (SMS) và Cell Broadcast Short Message Service (CBS). Mặc
dù tin nhắn WMA tương tự như datagram, WMA không sử dụng giao diện datagram
được định nghĩa bởi GCF, giao diện này dùng cho kết nối UDP. Thay vào đó, WMA
định nghĩa một tập giao diện mới trong gói java.wireless.messaging.
Để gởi hoặc nhận tin nhắn, ứng dụng trước hết phải tạo một instance của giao diện
MessageConnection, sử dụng GCF connection factory. Địa chỉ URL chuyển cho
phương thức java.microedition.io.Connector.open() chỉ định giao thức sử dụng (SMS
hoặc CBS), và số điện thoại đích, cổng, hoặc cả hai. Ví dụ, đây là những URL hợp lệ:
sms://+417034967891
sms://+417034967891:5678
sms://:5678
cbs://:5678
URL trong hai dạng đầu tiên mở kết nối client, ứng dụng kết nối đến một server với
địa chỉ thiết bị và cổng chỉ định. Nếu cổng không chỉ định, sẽ dùng cổng nhắn tin
mặc định của ứng dụng. Dạng URL thứ ba mở một kết nối server trên thiết bị, cho
phép ứng dụng đợi và hồi đáp tin nhắn đến từ các thiết bị khác. Dạng cuối cùng cho
phép ứng dụng lắng nghi tin nhắn broadcast từ người điều hành mạng.
Sau đây là một ví dụ đơn giản tạo một kết nối SMS client:
import java.microedition.io.*;
import java.wireless.messaging.*;
.....
MessageConnection conn = null;
String url = "sms://+417034967891";
try {
conn = (MessageConnection) Connector.open( url );
// thực hiện công việc gì đó
}
catch( Exception e ){
// xử lý lỗi
}
finally {
if( conn != null ){
try { conn.close(); } catch( Exception e ){}
}
}
Để gởi tin nhắn, sử dụng phương thức MessageConnection.newMessage() để tạo một
tin nhắn rỗng, thiết lập payload của nó (dữ liệu văn bản hoặc nhị phân để gởi), và
triệu gọi phương thức MessageConnection.send():
public void sendText( MessageConnection conn, String text )
throws IOException, InterruptedIOException {
TextMessage msg = conn.newMessage( conn.TEXT_MESSAGE );
msg.setPayloadText( text );
conn.send( msg );
} Gởi dữ liệu nhị phân cũng hoàn toàn tương tự:
public void sendBinary( MessageConnection conn, byte[] data )
throws IOException, InterruptedIOException {
BinaryMessage msg =conn.newMessage( conn.BINARY_MESSAGE );
msg.setPayloadData( data );
conn.send( msg );
}
Dĩ nhiên, có giới hạn lượng dữ liệu có thể gởi trong một tin nhắn. Thông thường, tin
nhắn văn bản SMS bị giới hạn đến 160 hoặc 70 ký tự, tin nhắn nhị phân bị giới hạn
đến 140 bytes.
Nhận tin nhắn thậm chí còn đơn giản hơn: Sau khi mở một kết nối server, ứng dụng
gọi phương thức receive() của kết nối, phương thức này sẽ trả về tin nhắn có trong
cổng đã xác định. Nếu không có tin nhắn, phương thức sẽ đứng (block) cho đến khi
có tin nhắn, hoặc cho đến khi có một thread khác đóng kết nối:
import java.io.*;
import java.microedition.io.*;
import java.wireless.messaging.*;
MessageConnection conn = null;
String url = "sms://:5678"; // không có số điện thoại!
try {
conn = (MessageConnection) Connector.open( url );
while( true ){
Message msg = conn.receive(); // blocks
if( msg instanceof BinaryMessage ){
byte[] data =((BinaryMessage) msg).getPayloadData();
// thực hiện công việc gì đó
} else {
String text =((TextMessage) msg).getPayloadText();
//thực hiện công việc gì đó
}
}
}
catch( Exception e ){
//xử lý lỗi
}
finally {
if( conn != null ){
try { conn.close(); } catch( Exception e ){}
}
}
Để bảo đảm tính ổn định của chương trình, việc gởi và nhận thông điệp nên giao cho
một thread riêng đảm nhận.