Каков самый быстрый способ поддержать службу REST с помощью Java?
У меня есть несколько полезных методов, которые я написал в Java, для создания тестовых данных для службы. Несколько моих коллег, которые имеют один и тот же вариант использования, подумали, что было бы здорово, если бы они могли повторно использовать его, но они пишут свои тесты в Perl и Python соответственно. Поэтому я думаю о том, чтобы открыть службу JSON REST, которая будет раскрывать эти методы.
У меня ограниченный опыт написания веб-приложений. Каким будет самый быстрый способ встать и развернуть мой сервис?
Я думаю использовать eclipse/ spring для этого и ant для развертывания в контейнере Jetty. Но я хотел бы услышать об этом. Также кажется, что некоторые IDE/плагины имеют лучшую поддержку некоторых технологий, чем другие. Поэтому я хотел бы услышать, что технология IDE/Plugins + J2EE Technology + Server (если это имеет значение) является хорошей комбинацией для моего использования и почему. Я хотел бы придерживаться программного обеспечения с открытым исходным кодом.
Ответы
Ответ 1
Я полагаю, что использование Maven позволяет вам быстро и быстро. Вот как вы можете это сделать.
Он использует RESTEasy реализацию JAX-RS (Java API для RESTful Web Services, официальной части Java EE 6).
Это проект java war maven с минимальной минимальной структурой. Это файлы:
-pom.xml
-src
|
--main
|
--java
|
--rest
|
--HelloResource.java
--JaxRsActivator.java
Я назвал его simpleRest
, как показано ниже. Все архивы точно такие, как показано:
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>simpleRest</groupId>
<artifactId>simpleRest</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>2.3.1.GA</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<!-- So maven doesn't require web.xml -->
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
</project>
HelloResource.java
package rest;
import java.util.Date;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path("/hello")
public class HelloResource {
@GET
@Produces("text/plain")
public String helloResource() {
return "Hello! It "+new Date();
}
}
JaxRsActivator.java:
package rest;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/rest")
public class JaxRsActivator extends Application {
}
Это генерирует a simpleRest.war
(через mvn clean package
). Вы можете развернуть его на недавно установленном JBoss AS 7.1.1.Final (просто выбросьте файл войны в папку развертывания) или Tomcat.
После этого URL доступен как ожидалось:
http://127.0.0.1:8080/simpleRest/rest/hello
Насколько это быстро?
Ответ 2
Вот кратчайший путь, который я мог бы придумать для полностью функционального REST API, требующего только Java, Gradle и текстового редактора. Создайте два файла в чистой директории проекта следующим образом:
build.gradle
buildscript {
repositories { mavenCentral() }
dependencies {
classpath 'org.gradle.api.plugins:gradle-tomcat-plugin:0.9.8'
}
}
apply plugin: 'tomcat'
repositories { mavenCentral() }
dependencies {
compile(
'com.sun.jersey:jersey-core:1.17',
'com.sun.jersey:jersey-server:1.17',
'com.sun.jersey:jersey-servlet:1.17',
'com.sun.jersey:jersey-json:1.17',
)
tomcat(
'org.apache.tomcat:tomcat-catalina:7.0.40',
'org.apache.tomcat:tomcat-coyote:7.0.40',
'org.apache.tomcat:tomcat-jasper:7.0.40',
)
}
SRC/Основной/Java/орг/пример/TheApplication.java
package org.example;
import com.sun.jersey.api.core.ClassNamesResourceConfig;
import javax.ws.rs.*;
import javax.ws.rs.core.Response;
import javax.xml.bind.annotation.XmlRootElement;
@Path("/")
@ApplicationPath("/")
public class TheApplication extends ClassNamesResourceConfig {
public TheApplication() { super(TheApplication.class); }
static Foo foo = new Foo();
@GET @Produces("application/json")
public Foo getFoo() {
return foo;
}
@POST @Consumes("application/json")
public Response setFoo(Foo foo) {
TheApplication.foo = foo;
return Response.ok().entity("Stored it!").build();
}
@XmlRootElement
static class Foo {
private String message = "Hello World";
public String getMessage() { return message; }
public void setMessage(String message) { this.message = message; }
}
}
Как только эти два файла находятся на месте, gradle tomcatRunWar
запустит ваш REST API, а переход на http://localhost:8080/fastest-web-service/
в браузере даст вам сообщение "Hello World" JSON. Если вы затем POST похожий JSON, например {"message": "something else"}
на тот же URL с чем-то вроде curl или Poster, указав приложение Content-Type of/json ", что новый объект будет сохранен и возвращен при последовательных запросах GET. Это просто очень простой пример, но охватывает множество основ API JSON.
IDE. Вы можете легко развить это с помощью любой обычной Java IDE. Сообщество Edition IntelliJ IDEA и Eclipse - оба популярных и бесплатных IDE. <opinion>
IDEA намного превосходит, и Ultimate Edition на 110% стоит стоимости личной лицензии для обычного Java-разработчика. </opinion>
Технологический стек: JAX-RS - это один из ведущих способов написания API REST в Java. Выберите любую реализацию. В этом примере используется Jersey, эталонная реализация. Spring может быть излишним, если вам просто нужен простой API для раскрытия уже написанной логики. Это приносит больше сложностей, чем кажется вам. С другой стороны, если вам нужна более гибкая и эффективная инфраструктура, которая имеет более встроенную поддержку практически во всем мире, Spring может быть только билетом.
Сервер: Jetty или Tomcat, поддерживающий Servlet 3.0. Вероятно, это не причина для чего-то более или менее.
Ответ 3
Ну, я собираюсь бросить IDE NetBeans в комплекте с GlassFish 3.x на ринг.
Загрузите этот комплект, установите его, а сервисные службы JAX-RS - это мастер щелчка правой кнопкой мыши. Одна загрузка, одна установка, полностью полная. Много документации, мастеров и образцов.
Это действительно самый короткий путь, и это полный набор инструментов.
Ответ 4
То, что мы собираемся сделать в моей компании, - это сервер Apache TomEE, используя JAX-RS, чтобы разоблачить наш API как службы REST. Легко настраивать и легко работать.
Ответ 5
У меня есть хороший опыт работы с Джерси, который является эталонной реализацией jax-ws. Он поддерживает аннотации jax-ws и удобен в использовании.
Ответ 6
В качестве консультанта мне платят за решение проблем. Я обнаружил, что Espresso Logic - это самый быстрый способ доставки JSON/REST API. Он работает на фундаменте Tomcat и может быть легко развернут локально, на Elastic Beanstalk или Microsoft Azure. Он подключается ко всем основным базам данных SQL и предоставляет мне мгновенный REST API для всех таблиц, представлений, хранимых процедур и отношений (которые используются для создания более сложных ресурсов стиля документа). Он имеет как HTML Studio, так и командную строку Node.JS для администрирования. Лучшей особенностью является декларативная логика (например, электронная таблица) для формулы, дериваций и валидаций. Логику можно расширить, используя библиотеки JavaScript и Java. Я трачу свое время на разработку решений JavaScript и позволяю Espresso делать тяжелую работу с разбивкой по страницам REST, оптимистичной блокировкой, оптимизацией SQL-запросов и логикой транзакций с несколькими столами. Полное раскрытие информации - я знаю их уже 25 лет, и это лучшая игра, меняющая технологию. Проверьте это: www.espressologic.com
Ответ 7
Я хотел бы предложить следующий подход для написания веб-служб на основе REST. Следующее "script" поможет вам создать очень простой и легкий веб-проект, используя Kikaha и Undertow. Ниже приведен пример, основанный на JAXRS, представленный Райаном Стюартом, но с более высокой производительностью и низким уровнем охвата из-за архитектуры Undertow (Undertow очень быстро).
-
Используйте инструмент командной строки Kikaha для создания проекта заглушки:
Проект kikaha create 2.0 --name = my-app
-
Хотя приведенная выше команда предоставляет вам несколько классов API REST из коробки, вы можете создать свой собственный класс сущностей, который представляет ваше бизнес-правило, как показано ниже.
User.java
import lombok.*;
@Getter
@Setter
public class User {
@NonNull Long id;
@NonNull String name;
}
- Создайте класс маршрута. Он будет выставлять методы как конечные точки REST.
UserResource.java
import lombok.*;
import kikaha.urouting.api.*;
import javax.inject.*;
@Singleton
@Path("user")
@Consumes( Mimes.JSON )
@Produces( Mimes.JSON )
public class UserResource {
User savedUser;
@POST
public Response saveUser( User user ){
if ( user.getName().isEmpty() )
return DefaultResponses.preconditionFailed()
.entity("Name is blank");
savedUser = user;
return DefaultResponses.ok();
}
@GET
public User getUser(){
return savedUser;
}
}
-
Запустите проект 5Mb через командную строку:
kikaha run-app
Отказ от ответственности. Я занимался разработкой Kikaha и имплантировал многие проекты Undertow со своей первой версии.
Ответ 8
Чтобы ускорить использование Jersey рамки в соответствии с https://stackoverflow.com/a/3891380/1497139
мы (BITPlan - моя компания) создали следующие проекты с открытым исходным кодом:
См. примеры кода ниже, как настроить:
- сервер
- некоторый контент приложения, который будет использоваться (Пользователь)
- некоторый ресурс, отображающий содержимое (UserResource)
- тестовый пример, показывающий, что все работает
Тест для примера
package com.bitplan.simplerest.example;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import com.bitplan.rest.RestServer;
import com.bitplan.rest.test.TestRestServer;
/**
* test the example Server
* @author wf
*
*/
public class TestExampleServer extends TestRestServer {
boolean debug=true;
@Before
public void initServer() throws Exception {
startServer();
}
@Override
public RestServer createServer() throws Exception {
RestServer result = new ExampleServer();
return result;
}
@Test
public void testExampleServer() throws Exception {
String userXml=getResponseString("application/xml", "/example/user");
if (debug)
System.out.println(userXml);
String expected="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><user><name>Doe</name><firstname>John</firstname><email>[email protected]</email></user>";
assertEquals(expected,userXml);
String userJson=getResponseString("application/json", "/example/user");
if (debug)
System.out.println(userJson);
String expectedJson="{\"name\":\"Doe\",\"firstname\":\"John\",\"email\":\"[email protected]\"}";
assertEquals(expectedJson,userJson);
}
}
ExampleServer
package com.bitplan.simplerest.example;
import com.bitplan.rest.RestServerImpl;
/**
* an Example Server
* @author wf
*
*/
public class ExampleServer extends RestServerImpl {
/**
* construct Example Server
* setting defaults
* @throws Exception
*/
public ExampleServer() throws Exception {
// listen to whole network
settings.setHost("0.0.0.0");
// listen on given port
settings.setPort(8111);
// add the default path
settings.setContextPath("/example");
// add a static handler
settings.addClassPathHandler("/", "/static/");
// setup resources from the given packages
String packages="com.bitplan.simplerest.example.resources;";
settings.setPackages(packages);
}
/**
* start Server
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
ExampleServer rs=new ExampleServer();
rs.settings.parseArguments(args);
rs.startWebServer();
} // main
}
User
package com.bitplan.simplerest.example;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
/**
* example class
*/
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class User {
public String name;
public String firstname;
public String email;
}
Пользовательский ресурс
package com.bitplan.simplerest.example.resources;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import com.bitplan.simplerest.example.User;
@Path("/user")
public class UserResource {
@GET
public User getUser() {
User user=new User();
user.name="Doe";
user.firstname="John";
user.email="[email protected]";
return user;
}
}
Ответ 9
Все ответы применимы к использованию Java локально с локальным контейнером. Если вы рассматриваете облачные среды, поддерживающие Java (и Java-подобные расширения), вы можете сделать это одним только.
Платформа Raimme предлагает удобную аннотацию @Rest. Все, что вам нужно сделать, это установить URL-адрес, и ваша служба REST будет открыта автоматически:
@Rest(url = "customer/list")
@ResponseBody
public String getCustomer()
{
return "[]";
}
Вся эта функция описана более подробно здесь: http://raimme.com/devcenter?questionId=1cg000000000g