`
sb33060418
  • 浏览: 152295 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Restlet 2.0 边学边写(七)Restlet返回xml和json数据格式

    博客分类:
  • REST
阅读更多
上一次实践实现了html form来访问Restlet的PUT和DELETE方法,但返回数据都是string,仅能作为演示使用。本次实践将使各方法返回xml和json格式的数据,方便页面、程序的读取和展示。

1.xml库
首先是基础的xml数据格式。Restlet的扩展包org.restlet.ext.xml.jar提供各种xml相关类库。包中的抽象类XmlRepresentation作为父类提供接口和方法,但不能创建该父类的实例,而是需要使用SaxRepresentation和DomRepresentation类的实例来执行操作。

将Restlet安装目录\Edition Java EE\2.0.10\lib下的org.restlet.ext.xml.jar包加入Build Path。

2.Resource
修改com.sunny.restlet.order.CustomersResource类,代码如下:
	@Override
	protected Representation get() throws ResourceException {
		// TODO Auto-generated method stub
		Map customers = orderDao.getAllCustomers();
		DomRepresentation representation;
		try {
			representation = new DomRepresentation();
			Document dom = representation.getDocument();
			Element all = dom.createElement("customers");
			dom.appendChild(all);
			for (Object object : customers.entrySet()) {
				Entry<String, Customer> entry = (Entry) object;
				String id = entry.getKey();
				Customer customer = entry.getValue();
				Element root = dom.createElement("customer");
				root.setAttribute("id", id);
				all.appendChild(root);
				Element namElement = dom.createElement("name");
				namElement.appendChild(dom.createTextNode(customer.getName()));
				root.appendChild(namElement);
				Element addressElement = dom.createElement("address");
				addressElement.appendChild(dom.createTextNode(customer
						.getAddress()));
				root.appendChild(addressElement);
			}
			dom.normalizeDocument();
			return representation;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	@Override
	protected Representation post(Representation entity)
			throws ResourceException {
		// TODO Auto-generated method stub
		Form form = new Form(entity);
		String name = form.getFirstValue("name");
		String address = form.getFirstValue("address");
		Customer customer = new Customer(name, address);
		String id = orderDao.addCustomer(customer);
		customer = orderDao.getCustomerById(id);
		if (customer == null) {
			return null;
		}
		DomRepresentation representation;
		try {
			representation = new DomRepresentation();
			Document dom = representation.getDocument();
			Element root = dom.createElement("customer");
			root.setAttribute("id", id);
			dom.appendChild(root);
			Element namElement = dom.createElement("name");
			root.appendChild(namElement);
			namElement.appendChild(dom.createTextNode(customer.getName()));
			Element addressElement = dom.createElement("address");
			root.appendChild(addressElement);
			addressElement.appendChild(dom
					.createTextNode(customer.getAddress()));
			dom.normalizeDocument();
			return representation;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

类中将/customers资源的get和post方法返回的Representation修改为DomRepresentation,并创建dom文件来格式化数据。

修改com.sunny.restlet.order.CustomerResource类,代码如下:
	@Override
	protected Representation delete() throws ResourceException {
		// TODO Auto-generated method stub
		String customerId = (String) getRequest().getAttributes().get("custId");
		orderDao.deleteCustomerById(customerId);
		DomRepresentation representation;
		try {
			representation = new DomRepresentation();
			Document dom = representation.getDocument();
			Element root = dom.createElement("message");
			dom.appendChild(root);
			root.appendChild(dom.createTextNode("success"));
			dom.normalizeDocument();
			return representation;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	@Override
	protected Representation get() throws ResourceException {
		// TODO Auto-generated method stub
		String customerId = (String) getRequest().getAttributes().get("custId");
		Customer customer = orderDao.getCustomerById(customerId);
		if (customer == null) {
			return null;
		}
		DomRepresentation representation;
		try {
			representation = new DomRepresentation();
			Document dom = representation.getDocument();
			Element root = dom.createElement("customer");
			root.setAttribute("id", customerId);
			dom.appendChild(root);
			Element namElement = dom.createElement("name");
			root.appendChild(namElement);
			namElement.appendChild(dom.createTextNode(customer.getName()));
			Element addressElement = dom.createElement("address");
			root.appendChild(addressElement);
			addressElement.appendChild(dom
					.createTextNode(customer.getAddress()));
			dom.normalizeDocument();
			return representation;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	@Override
	protected Representation put(Representation entity)
			throws ResourceException {
		// TODO Auto-generated method stub
		String customerId = (String) getRequest().getAttributes().get("custId");
		Form form = new Form(entity);
		String name = form.getFirstValue("name");
		String address = form.getFirstValue("address");
		Customer customer = new Customer(name, address);
		orderDao.updateCustomerById(customer, customerId);
		customer = orderDao.getCustomerById(customerId);
		if (customer == null) {
			return null;
		}
		DomRepresentation representation;
		try {
			representation = new DomRepresentation();
			Document dom = representation.getDocument();
			Element root = dom.createElement("customer");
			root.setAttribute("id", customerId);
			dom.appendChild(root);
			Element namElement = dom.createElement("name");
			root.appendChild(namElement);
			namElement.appendChild(dom.createTextNode(customer.getName()));
			Element addressElement = dom.createElement("address");
			root.appendChild(addressElement);
			addressElement.appendChild(dom
					.createTextNode(customer.getAddress()));
			dom.normalizeDocument();
			return representation;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

类中将/customer/{custId}的资源的get、put和delete方法返回的Representation修改为DomRepresentation,并创建dom文件来格式化数据。

3.测试
部署程序后,使用浏览器访问http://localhost:8080/firstSteps/,并将页面上的五个链接在新页面中打开访问。
在post.jsp中输入[name=0, address=0]并提交form,可以看到提示信息
  • <?xml version="1.0" encoding="UTF-8"?>
  • <customer id="0">
  • <name>0</name>
  • <address>0</address>
  • </customer>

说明调用post方法访问/customers返回xml数据成功,数据被新增。

再次在post.jsp中输入[name=1, address=1]并提交form,刷新get customers"链接页面,可以看到提示信息
  • <?xml version="1.0" encoding="UTF-8"?>
  • <customers>
  • <customer id="0">
  • <name>0</name>
  • <address>0</address>
  • </customer>
  • <customer id="1">
  • <name>1</name>
  • <address>1</address>
  • </customer>
  • </customers>

说明调用get方法访问/customers返回xml数据成功。

在put.jsp中输入[id=0, name=00, address=00]并提交form,可以看到提示信息
  • <?xml version="1.0" encoding="UTF-8"?>
  • <customer id="0">
  • <name>00</name>
  • <address>00</address>
  • </customer>

说明调用put方法访问/customer/{custId}返回xml数据成功,数据被修改。

在get.jsp中输入[id=0]并提交form,可以看到提示信息同上。说明调用get方法访问/customer/{custId}返回xml数据成功。

在delete.jsp中输入[id=0]并提交form,可以看到提示信息
  • <?xml version="1.0" encoding="UTF-8"?>
  • <message>success</message>

刷新get customers"链接页面,可以看到提示信息
  • <?xml version="1.0" encoding="UTF-8"?>
  • customers>
  • <customer id="1">
  • <name>1</name>
  • <address>1</address>
  • </customer>
  • </customers>

说明调用delete方法访问/customer/{custId}返回xml数据成功,数据被删除。

4.使用ClientResource测试
下面我们使用第五节中用到的ClientResource客户端方式调用Restlet服务。
修改com.sunny.restlet.order.CustomerResource类,代码如下:
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		try {
			ClientResource clientCustomers = new ClientResource(
					"http://localhost:8080/firstSteps/spring/customers");
			ClientResource clientCustomer = new ClientResource(
					"http://localhost:8080/firstSteps/spring/customers/0");
			Form form = new Form();
			form.add("name", "b");
			form.add("address", "b");
			Representation representation = clientCustomers.post(form);
			System.out.println(representation.getText());
			representation = clientCustomers.get();
			System.out.println(representation.getText());
			form.clear();
			form.add("name", "c");
			form.add("address", "c");
			representation = clientCustomer.put(form);
			System.out.println(representation.getText());
			representation = clientCustomer.get();
			System.out.println(representation.getText());
			representation = clientCustomer.delete();
			System.out.println(representation.getText());
			representation = clientCustomers.get();
			System.out.println(representation.getText());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}


重新部署firstSteps后,运行Test类,在控制台可以看到输出信息
  • 2013-1-6 16:45:29 org.restlet.engine.http.connector.HttpClientHelper start
  • 信息: Starting the default HTTP client
  • <?xml version="1.0" encoding="UTF-8"?><customer id="0"><name>b</name><address>b</address></customer>
  • <?xml version="1.0" encoding="UTF-8"?><customers><customer id="0"><name>b</name><address>b</address></customer></customers>
  • 2013-1-6 16:45:29 org.restlet.engine.http.connector.HttpClientHelper start
  • 信息: Starting the default HTTP client
  • <?xml version="1.0" encoding="UTF-8"?><customer id="0"><name>c</name><address>c</address></customer>
  • <?xml version="1.0" encoding="UTF-8"?><customer id="0"><name>c</name><address>c</address></customer>
  • <?xml version="1.0" encoding="UTF-8"?><message>success</message>
  • <?xml version="1.0" encoding="UTF-8"?><customers/>

说明客户端方式调用成功。

5.json库
Json作为现在通用的互联网数据传输格式,Restlet当然要支持的了。Restlet的扩展包org.restlet.ext.json.jar提供各种xml相关类库。包中的JsonRepresentation类可以作为返回数据载体使用,其中对多种数据类型提供了支持。

将Restlet安装目录\Edition Java EE\2.0.10\lib下的org.restlet.ext.json.jar包和org.json.jar包加入Build Path。

6.Resource
修改com.sunny.restlet.order.CustomersResource类,代码如下:
	@Override
	protected Representation get() throws ResourceException {
		// TODO Auto-generated method stub
		Map customers = orderDao.getAllCustomers();
		return new JsonRepresentation(customers);
	}

	@Override
	protected Representation post(Representation entity)
			throws ResourceException {
		// TODO Auto-generated method stub
		Form form = new Form(entity);
		String name = form.getFirstValue("name");
		String address = form.getFirstValue("address");
		Customer customer = new Customer(name, address);
		String id = orderDao.addCustomer(customer);
		customer = orderDao.getCustomerById(id);
		if (customer == null) {
			return null;
		}
		return new JsonRepresentation(customer);	
	}

类中将/customers资源的get和post方法返回的Representation修改为JsonRepresentation。

修改com.sunny.restlet.order.CustomerResource类,代码如下:
	@Override
	protected Representation delete() throws ResourceException {
		// TODO Auto-generated method stub
		String customerId = (String) getRequest().getAttributes().get("custId");
		orderDao.deleteCustomerById(customerId);
		return new JsonRepresentation("success");
	}

	@Override
	protected Representation get() throws ResourceException {
		// TODO Auto-generated method stub
		String customerId = (String) getRequest().getAttributes().get("custId");
		Customer customer = orderDao.getCustomerById(customerId);
		if (customer == null) {
			return null;
		}
		return new JsonRepresentation(customer);
	}

	@Override
	protected Representation put(Representation entity)
			throws ResourceException {
		// TODO Auto-generated method stub
		String customerId = (String) getRequest().getAttributes().get("custId");
		Form form = new Form(entity);
		String name = form.getFirstValue("name");
		String address = form.getFirstValue("address");
		Customer customer = new Customer(name, address);
		orderDao.updateCustomerById(customer, customerId);
		customer = orderDao.getCustomerById(customerId);
		if (customer == null) {
			return null;
		}
		return new JsonRepresentation(customer);
	}

类中将/customer/{custId}的资源的get、put和delete方法返回的Representation修改为JsonRepresentation。可以看到JsonRepresentation对各数据类型的支持。

7.测试
重新部署firstSteps后,运行Test类,在控制台可以看到输出信息
  • 2013-1-6 17:32:20 org.restlet.engine.http.connector.HttpClientHelper start
  • 信息: Starting the default HTTP client
  • {"address":"b","name":"b"}
  • {"0":"Customer [name=b, address=b]"}
  • 2013-1-6 17:32:21 org.restlet.engine.http.connector.HttpClientHelper start
  • 信息: Starting the default HTTP client
  • {"address":"c","name":"c"}
  • {"address":"c","name":"c"}
  • success
  • {}

说明客户端方式调用资源,返回json数据成功。

同样可以通过页面来访问修改后的程序,但是返回会是个文件,下载打开后内容和上面的提示信息类似。

8.思考
我们也可以简单的使用StringRepresentation来达到相同的效果,但是需要自己在代码中调用Dom4J和JSON类库来生成json和xml字符串,再使用StringRepresentation将结果返回。
分享到:
评论
1 楼 sb33060418 2013-01-10  
原来在CustomersResource.get()方法中使用new JsonRepresentation(customers)是不对的,从返回结果上可以看到返回的是•{"0":"Customer [name=b, address=b]"} ,里面的Customer没有被转化为key/value的json格式,而只是简单调用了toString方法。

需要将new JsonRepresentation(customers)修改为new JsonRepresentation(new JSONObject(customers,false)),即调用JSONObject类的JSONObject(Map map, boolean includeSuperClass)方法,具体内容可以看JSONObject类的代码。
同样,如果返回数据的类型是数组Array/Collection,也需要使用JSONArray(Collection collection, boolean includeSuperClass)来返回json格式数据。

相关推荐

    Restlet Client 插件安装包

    对于POST、PUT等需要提交数据的方法,它支持多种数据格式,如JSON、XML、表单数据等。 2. **请求预览**: 在发送请求之前,你可以预览完整的HTTP请求,确保所有设置正确无误。 3. **响应查看**: 收到服务器的响应后,...

    RESTLET开发

    ### RESTLET开发实例详解 #### 一、RESTLET框架简介 **RESTLET**是一个轻量级且全面的框架,...此外,RESTLET框架的灵活性还允许开发者轻松地扩展服务的功能,比如支持更多的数据格式(如JSON)或增加安全措施等。

    Restlet所需要的所有jar包

    3. **协议栈**:Restlet支持多种传输协议,如HTTP、HTTPS、WebSocket等,同时也支持多种数据格式,如JSON、XML、Plain Text等。这些功能由不同的jar包提供,确保了跨平台和多协议的支持。 4. **扩展和模块**:...

    restlet

    3. **媒体类型处理**:RESTlet支持多种媒体类型,如JSON、XML、HTML等,允许开发者方便地处理数据交换。它还支持自定义的媒体类型,以适应特定的应用场景。 4. **过滤器机制**:RESTlet的过滤器可以插入到请求和...

    restlet restful

    它通常以JSON或XML格式传输数据,这两种格式易于解析且跨平台兼容性好。 "绝对不坑"可能意味着这个项目或者RESTlet框架在使用过程中相对稳定,没有太多隐藏的陷阱或者难以理解的问题,开发者可以放心使用。 在提供...

    Restlet in action 英文 完整版

    该框架支持多种传输协议(如HTTP、HTTPS、FTP等),并能够处理各种数据格式(例如JSON、XML)。 在《Restlet in Action》的第一章“Introducing the Restlet Framework”中,作者们详细解释了Restlet框架的核心概念...

    restlet项目

    3. **Representation**: RESTful服务中的数据以“表示”形式存在,可以是文本、XML、JSON等。Restlet提供了一种处理和转换这些表示的方法。 4. **Directory**: 类似于文件系统,用于存储和管理资源。这有助于组织和...

    Restlet开发实例

    在这个实例中,你将学习如何使用Restlet框架结合JAX-RS来定义资源、处理HTTP方法(如GET、POST、PUT、DELETE等)以及如何处理JSON或XML数据。Restlet提供了JAX-RS兼容的组件,使得开发者可以轻松地在Restlet环境中...

    RestletClient接口调试

    4. **解析和分析响应**:RestletClient会高亮显示响应体,如果返回的是JSON或XML,它会以树形结构展示数据,便于查看和理解。此外,你可以查看响应时间,这对于性能优化很有帮助。 5. **保存和重放请求**:为了方便...

    restlet-jee-2.0.3

    Restlet提供了强大的数据表示处理,支持多种媒体类型,如Text、XML、JSON等。 5. **Routing and Filtering**:Restlet提供了一种基于URI模板的路由机制,以及可插拔的过滤器链,允许开发者进行灵活的请求和响应处理...

    restlet2.1学习笔记项目代码

    3. **代表(Representation)**:在REST中,资源的状态通过数据的表示形式(如JSON、XML或HTML)来传达。在Restlet中,这些表示通常通过`org.restlet.data.MediaType`定义,并由`Representation`接口的实现来处理。 ...

    Restlet与Spring 集成

    这个方法接收请求参数,并通过`getResponse().setStatus()`设置状态码,通过`getResponse().setEntity()`设置返回的JSON值。 3. **配置Restlet与Spring**: - **restletContext.xml**:这是Restlet的配置文件,...

    restlet.jar

    6. **Converter**: 负责数据格式的转换,如将Java对象转化为JSON或XML。 在实际应用中,你可以通过继承`org.restlet.resource.ServerResource`并覆盖其方法来定义一个资源,然后使用`Component`来配置和启动服务。...

    org.restlet.jar org.restlet.ext.jackson.jar(nutch 2.2.1无法下载的jar包)

    Jackson是Java中非常流行的一个JSON处理库,可以用于序列化和反序列化Java对象到JSON格式,以及从JSON数据中创建Java对象。Nutch在抓取和处理网页数据时,可能会遇到需要解析JSON格式的元数据或者配置文件的情况,这...

    52-restlet.rar_restlet

    4. **数据交换格式**:讨论Restlet支持的数据交换格式,如JSON、XML、Plain Text等,以及如何进行序列化和反序列化操作。 5. **客户端API**:介绍如何使用Restlet客户端API来发起HTTP请求,获取服务器响应,并处理...

    基于Spring的Restlet实例

    6. **数据序列化与反序列化**:在REST服务中,数据通常以JSON或XML格式交换。Restlet提供了解析和生成这些格式的能力,但也可以结合Jackson或Gson等库进行更复杂的序列化和反序列化。 7. **测试和调试**:为了确保...

    restlet所需jar包一

    它强调资源的表述,通过HTTP协议进行交互,支持多种数据格式,如JSON和XML。Restlet框架提供了一组组件和工具,使得开发者能够更容易地实现REST原则,并创建符合这种风格的Web服务。 标题"restlet所需jar包一"表明...

    restlet-j2ee-2.0.15.rar

    此外,Restlet支持多种数据格式的交换,包括XML、JSON、HTML等,这使得它在构建跨平台、跨设备的Web服务时具有很大的灵活性。 在"restlet-jee-2.0.15"这个版本中,你可能会找到以下内容: - `restlet.jar`:主库...

    restlet工程示例

    - RESTful服务通常使用JSON或XML作为数据交换格式。Restlet提供了`Representation`类来处理这些格式。 - 可以使用`JsonRepresentation`或`XmlRepresentation`来序列化和反序列化数据。 6. **路由和参数处理** - ...

    restlet实现最简单的restful webservice

    同时,你还可以处理JSON或XML数据,实现更复杂的业务逻辑。 Restlet框架提供了丰富的API和扩展性,使得开发RESTful服务变得更加简单和高效。 总的来说,Restlet提供了一种直观的方式来构建RESTful Web服务,其简洁...

Global site tag (gtag.js) - Google Analytics