我即将开始一个小项目,目标是最终得到一个web xml / json api。我将用Java编写它,并且我将使用restlet库。
如何处理xml / json二元性?我知道我可以使用JAXB来转换" pojos到xml(和后面),但我如何为json自动执行此操作?我可以利用restlet库中的任何功能吗?
答案 0 :(得分:1)
Restlet允许您在REST注释方法级别直接使用服务器资源中的POJO,如下所述:
public class MyServerResource extends ServerResource {
@Get
public List<MyPojo> getList() {
List<MyPojo> list = (get list from backend for example)
return list;
}
@Post
public MyPojo addPojo(Pojo pojo) {
addPojoInBackend(pojo
getResponse().setLocationRef(getUri() + field.getId());
getResponse().setStatus(Status.SUCCESS_CREATED);
return pojo;
}
}
您无需在注释内容中指定媒体类型(即内容类型)。
为了处理这样的代码,Restlet提供了一个通用的转换功能,可以完成工作。 Restlet扩展为此功能提供了不同的实现。如果你想为你的RESTful应用程序同时拥有XML和JSON,我认为你应该为你想做的杰出扩展。 Jackson(http://wiki.fasterxml.com/JacksonHome)是一个允许将POJO转换为XML,JSON和YAML等各种格式的工具。
要启用此功能,只需将Jackson扩展的JAR文件(org.restlet.ext.jackson)放入类路径中,然后使用上述编程方法。以下是有关其工作原理的详细信息:
您将能够发送JSON和XML内容(在请求中设置标头Content-Type
),Restlet会自动将此内容转换为注释方法中预期的bean。
POST /myresource
Content-type: application/json
{ "id":"myid", ... }
要通过响应切换/选择预期内容,您可以根据标题Accept
利用连接(REST的内容取消)。如果您指定application/json
,则会收到JSON内容,并且会收到applicaiton/xml
,即XML。
GET /myresource
Accept: application/json
{ "id":"myid", ... }
GET /myresource
Accept: application/xml
<elt><id>myid> ... </elt>
您可以注意到Restlet还支持查询参数media
(非标准)来选择要接收的内容。如果您指定json
,将收到JSON内容,xml
将收到XML内容。
GET /myresource?media=json
{ "id":"myid", ... }
GET /myresource?media=xml
<elt><id>myid> ... </elt>
要完成,您可以注意到服务器端也支持Restlet这种机制。这意味着您可以直接使用bean。此功能可与Restlet带注释的接口一起使用,如下所述:
public interface MyResource {
@Get
List<MyPojo> getList();
@Post
MyPojo addPojo(Pojo pojo);
}
您可以按照以下说明使用此界面:
ClientResource cr = new ClientResource("http://(...)/myresource");
MyResource myResource = cr.wrap(MyResource.class);
// List
List<Pojo> list = myResource.getList();
// Add
Pojo pojo = new Pojo();
pojo.setId("myid"); // for example
(...)
Pojo returnedPojo = myResource.add(pojo);
Don'忘记在客户端类路径应用程序中放入扩展名Jackson。
希望它有所帮助, 亨利