Несколько дней назад я показал вам, как можно создать клиент ATOM, который может конвертировать ATOM XML в JSON . Сегодня я покажу вам, как взять Apache Abdera и создать сервер ATOMPub, который может возвращать ATOM XML, а также JSON. Для клиентской части (для демонстрации) я собираюсь использовать постер плагина Firefox .
Взгляните на мою предыдущую статью о сервере ATOMPub, так как это будет основой этого нового сервера. Чтобы добавить поддержку для возврата JSON, есть несколько шагов:
1. Убедитесь, что Maven настроен для добавления расширения JSON Apache Abdera
2. Измените код моей предыдущей статьи, чтобы он возвращал JSON по запросу клиента
При использовании исходного кода сервера ATOMPub вам нужно всего лишь добавить две строки кода для добавления в поддержку JSON:
Импорт для расширения JSON Apache Abdera:
import org.apache.abdera.ext.json.JSONFilter;
Добавить поддержку для JSONFilter:
provider.addFilter(new JSONFilter());
Окончательный код выглядит так:
/* * Original code created by the Apache Abdera team * http://abdera.apache.org/ */ package com.giantflyingsaucer.atompubserver; import org.apache.abdera.protocol.server.Provider; import org.apache.abdera.protocol.server.impl.DefaultProvider; import org.apache.abdera.protocol.server.impl.SimpleWorkspaceInfo; import org.apache.abdera.protocol.server.servlet.AbderaServlet; import org.apache.abdera.ext.json.JSONFilter; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class App { public static void main(String... args) throws Exception { int port = 9002; try { port = args.length > 0 ? Integer.parseInt(args[0]) : 9002; } catch (Exception e) { } Server server = new Server(port); ServletContextHandler context = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS); ServletHolder servletHolder = new ServletHolder(new EmployeeProviderServlet()); context.addServlet(servletHolder, "/*"); server.start(); server.join(); } public static final class EmployeeProviderServlet extends AbderaServlet { @Override protected Provider createProvider() { EmployeeCollectionAdapter ca = new EmployeeCollectionAdapter(); ca.setHref("employee"); SimpleWorkspaceInfo wi = new SimpleWorkspaceInfo(); wi.setTitle("Employee Directory Workspace"); wi.addCollection(ca); DefaultProvider provider = new DefaultProvider("/"); provider.addWorkspace(wi); provider.init(getAbdera(), null); provider.addFilter(new JSONFilter()); return provider; } @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { super.service(request, response); } } }
Для Maven убедитесь, что у вас есть эта зависимость (и оставьте те, которые у меня уже есть в предыдущем проекте):
<dependency> <groupId>org.apache.abdera</groupId> <artifactId>abdera-extensions-json</artifactId> <version>1.1.2</version> </dependency>
С помощью плаката я могу заполнить сервер Abdera некоторыми данными:
<?xml version="1.0"?> <entry xmlns="http://www.w3.org/2005/Atom"> <id>tag:example.org,2011:foo</id> <title type="text">This is the title</title> <updated>2011-09-18T18:50:22.356Z</updated> <content type="text">Hello World</content> </entry>
Вставьте данные с помощью Poster с помощью действия HTTP POST:
Получите данные обратно с помощью Poster с помощью действия HTTP GET и аргумента строки запроса: format = json
Полученные результаты:
"feed":{ "id":"tag:acme.com,2007:employee:feed", "title":"Acme Employee Database", "updated":"2011-09-18T18:52:59.359Z", "authors":[{ "name":"Acme Industries" } ], "links":[{ "href":"" },{ "href":"", "rel":"self" } ], "entries":[{ "id":"tag:giantflyingsaucer.com,2011:employee:entry:1000", "title":"Hello World", "content":"Hello World", "authors":[{ "name":"Acme Industries" } ], "links":[{ "href":"/employee/1000-Hello_World", "rel":"edit" } ] } ] } }
Конечно, вы можете взять мой проект клиента ATOM и изменить его для работы с этим сервером ATOMPub, а не использовать Poster.