Dojo JSON-RPC + Java


Dojo hỗ trợ JSON-RPC, là tính năng mở rộng của JSON dùng để triệu gọi phương thức từ xa. JSON-RPC có thể dùng như một phương tiện cho các ứng dụng cần giao tiếp với servers. Ví dụ sau sẽ chỉ ra cách tương tác với Java trên server và gọi một phương thức Java từ JavaScript dùng Dojo RPC services. Nó cũng cho thấy việc sử dụng JSON-RPC dễ dàng hơn khi dùng Java.

Đầu tiên, ta tạo một servlet và viết phương thức POST sẽ đọc nội dung của request:


public class JsonRPC extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String content = streamToString(req.getInputStream());

Ta dùng json.org’s Java library để phân tích và lấy ra các thuộc tính từ JSON object. Một JSON-RPC object gồm có 3 thuộc tính được định nghĩa để gọi: method, params, và id. Như sau:


JSONObject rpcObject = new JSONObject(content);
String methodName = rpcObject.getString("method");
String id = rpcObject.getString("id");
JSONArray paramsArray = rpcObject.getJSONArray("params");
Object[] params = new Object[paramsArray.length()];
for (int i = 0 ; i < paramsArray.length(); i++) {
params[i] = paramsArray.get(i);
}

Ta có thể dùng những thuộc tính này để chạy một phương thức trên một object. Nếu ta đã có tạo sẵn một object dùng như một target cho RPC, ta có thể gọi phương thức và thi hành nó:

for (Method method : target.getClass().getMethods()) {
// we could use getMethod(methodName, paramTypes) here but
// we would need to create a list of parameters types
if (method.getName().equals(methodName)) {
Object result = method.invoke(target, params);
...

Sau khi trả kết quả lại cho client. Response object cũng có 3 thuộc tính: id, result, và error. Ta sẽ dùng JSON library để dựng lại object này:

response.put("id",id); // id from the request
response.put("result",result); // result of the invocation
response.put("error",JSONObject.NULL); // no error
// send the response to the client
resp.getOutputStream().print(response.toString());

Đó là tất cả những gì cần để xây dựng class để gọi JSON-RPC. Cũng có thể dùng try/catch để kiểm soát lỗi:

try {
...
Object result = method.invoke(target, params);
...
} catch (Throwable e) {
response.put("id",id); // id from the request
response.put("result",JSONObject.NULL);
response.put("error",e.getMessage());
}

Tôi sẽ tạo một class rất đơn giản để gọi JSON-RPC:

public class Echo {
public String sayHi(String from) {
return "Hi " + from;
}
}

Và hiện thực:

target = new Echo();

Tiếp theo là khai báo một servlet trong file web.xml:

<servlet>
<servlet-name>JsonRpc</servlet-name>
<servlet-class>com.sitepen.JsonRPC</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JsonRpc</servlet-name>
<url-pattern>/jsonrpc/</url-pattern>
</servlet-mapping>


Gọi phương thức với Dojo



Trên client side, chúng ta có thể dùng simple method description (SMD) object để khai báo JSON-RPC và Dojo sẽ tạo phương thức thích hợp.

dojo.require("dojox.rpc.Service");
dojo.require("dojox.rpc.JsonRPC");

echoService = new dojox.rpc.Service({
envelope:"JSON-RPC-1.0",
transport:"POST",
target:"/jsonrpc/echo",
services:{
sayHi:{
parameters:[{type:"string"}] // this is optional
}
}
});

Giờ thì echo đã có phương thức sayHi thi hành tương ứng với phương thức trên Echo class. Chúng ta có thể gọi sayHi chỉ với một phương thức trên JavaScript. Tham số sẽ bao gồm trong JSON-RPC và dùng để gọi phương thức trên server. Ví dụ:

var deferred = echoService.sayHi("Kris");

Thi hành sayHi với đối số “Kris”. Giá trị trả về là Deferred object, và bạn có thể dùng bình thường, hay dùng callback:

deferred.addCallback(function(result) {
alert(result); // executed when the RPC is finished
});

Khi RPC response được trả về, callback function sẽ trả kết quả trên alert. Và “Hi Kris” hiện ra.

Multiple Target Objects


Chúng ta đã thực hiện xong phần triệu gọi RPC cho một object. Ta cũng có thể thực hiện cho nhiều objects. Một trong những điều kiện để có thể dùng multiple objects là tạo nhiều URL paths cho các target objects:

static Map rpcTargets = new HashMap();
public static void registerRpcTarget(String path, Object target) {
rpcTargets.put(path,target);
}

Sau đó là tìm đến target objects bằng URL path:

String targetPath = req.getPathInfo();
Object target = rpcTargets.get(targetPath);

Thêm một target objects là vần đề đơn giản nhất. Cho echo object, ta có thể khai báo như sau:

registerRpcTarget("/echo",new Echo());

Còn nếu bạn đã tạo một object mới, khai báo theo cấu trúc:

registerRpcTarget("/myObject",new MyClass());

Và thêm vào client side một service object khác từ SMD:

myObject = new dojox.rpc.Service({
envelope:"JSON-RPC-1.0",
transport:"POST",
target:"/jsonrpc/myObject",
services:{
foo:{
parameters:[{type:"string"}] // this is optional
}
}
});

Bạn có thể download đầy đủ source tại đây. Chúc thành công!

Cao Trong Hien

, ,

0 Responses to "Dojo JSON-RPC + Java"

Đăng nhận xét