sparkrestful_Spark⼊门:也可以⽤Java创建轻量级的RESTful
应⽤程序
spark restful
最近,我⼀直在使⽤ (⼀种Java的Web框架,与Apache Spark 不相关)编写RESTful服务。 当我们计划写这篇⽂章时,我已经做好了不可避免的接⼝,样板代码和深层层次结构的Java风格的准备。 令我惊讶的是,对于局限于Java的开发⼈员来说,还有⼀个替代世界。
在本⽂中,我们将了解如何使⽤JSON传输数据来为博客构建RESTful应⽤程序。 我们会看到:
如何在Spark中创建⼀个简单的Hello World
如何指定请求中期望的JSON对象的布局
如何发送帖⼦请求以创建新帖⼦
如何发送获取请求以检索帖⼦列表
我们不会看到如何在数据库中插⼊此数据。 我们只将列表保留在内存中(在我的实际服务中,我⼀直在
使⽤ )。
⼀些依赖
我们将使⽤Maven,因此我将⾸先创建⼀个新的l并添加⼀些内容。 基本上:
⽕花
杰克逊
Lombok
番⽯榴
Easymock(仅在测试中使⽤,本⽂中未介绍)
格森
<dependencies>
<dependency>
python转java代码
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-core</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>com.</groupId>
<artifactId>jackson-core</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>com.</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.sql2o</groupId>
<artifactId>sql2o</artifactId>
<version>1.5.4</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4-1201-jdbc41</version>
</dependency>
<dependency>
<groupId&le.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>3.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId&le.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId&jo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass&assetti.BlogService</mainClass> <arguments>
</arguments>
</configuration>
</plugin>
</plugins>
</build>
⽕花你好世界
你有这⼀切吗? 酷,那我们就写⼀些代码吧。
assetti;
import static ;
import static spark.Spark.post;
import spark.Request;
import spark.Response;
import spark.Route;
public class BlogService
{
public static void main( String[] args) {
get("/posts", (req, res) -> {
return "Hello Sparkingly World!";
});
}
}
现在,我们可以使⽤以下命令运⾏它:
mvn compile && mvn exec:java
让我们打开浏览器并访问localhost http:// localhost:4567 / posts 。 在这⾥我们要做⼀个简单的获取。 对于执⾏帖⼦,您可能需要在浏览器中使⽤Postman插件或只运⾏ 。 ⼀切为您服务。
使⽤Jackson和Lombok进⾏很棒的描述性交换对象
在⼀个典型的RESTful应⽤程序中,我们希望接收带有json对象的POST请求作为有效负载的⼀部分。 我们的⼯作将是检查代码是否为格式正确的JSON,是否与预期的结构相对应,值是否在有效范围内,等等。⽆聊且重复。 我们可以⽤不同的⽅式做到这⼀点。 最基本的⼀种是使⽤ :
JsonParser parser = new JsonParser();
JsonElement responseData = parser.parse(response);
if (!responseData.isJsonObject()){
// send an error like: "Hey, you did not pass an Object!
}
JsonObject obj = AsJsonObject();
if (!obj.hasField("title")){
// send an error like: "Hey, we were expecting a field name title!
}
JsonElement titleAsElem = ("title");
if (!titleAsElem.isString()){
/
/ send an error like: "Hey, title is not an string!
}
// etc, etc, etc
我们可能不想这样做。
指定我们期望的结构的更具声明性的⽅法是创建特定的类。
class NewPostPayload {
private String title;
private List<String> categories;
private String content;
public String getTitle() { ... }
public void setTitle(String title) { ... }
public List<String> getCategories() { ... }
public void setCategories(List<String> categories){ ... }
public String getContent() { ... }
public void setContent(String content) { ... }
}
然后我们可以使⽤Jackson:
try {
ObjectMapper mapper = new ObjectMapper();
NewPostPayload newPost = adValue(request.body(), NewPostPayload.class);
} catch (JsonParseException e){
// Hey, you did not send a valid request!
}
这样,杰克逊会⾃动为我们检查有效载荷是否具有预期的结构。 我们可能想验证是否遵守其他约束。 例如,我们可能要检查标题是否为空,并且⾄少指定了⼀个类别。 我们可以创建⼀个仅⽤于验证的接⼝:
interface Validable {
boolean isValid();
}
class NewPostPayload implements Validable {
private String title;
private List<String> categories;
private String content;
public String getTitle() { ... }
public void setTitle(String title) { ... }
public List<String> getCategories() { ... }
public void setCategories(List<String> categories){ ... }
public String getContent() { ... }
public void setContent(String content) { ... }
public boolean isValid() {
return title != null && !title.isEmpty() && !categories.isEmpty();
}
}
仍然有很多⽆聊的getter和setter⽅法。 它们的信息量不是很⼤,只会污染代码。 我们可以使⽤摆脱它们。 Lombok是⼀个注释处理器,可以为您添加重复⽅法(getter,setter,equals,hashCode等)。 您可以将其视为编译器的插件,该插件可查注释(例如@Data )并基于注释⽣成⽅法。 如果将其
添加到依赖项中,maven会很好,但是您的IDE⽆法为Lombok添加的⽅法⾃动完成。 您可能要安装插件。 对于Intellij Idea,我使⽤的是Lombok插件版本0.9.1,它的效果很好。
现在,您可以将类NewPostPayload修改为:
@Data
class NewPostPayload {
private String title;
private List<String> categories;
private String content;
public boolean isValid() {
return title != null && !title.isEmpty() && !categories.isEmpty();
}
}
好多了,是吗?
⼀个完整的例⼦
我们基本上需要做两件事:
1. 插⼊新帖⼦
2. 检索整个帖⼦列表
第⼀个操作应实现为POST(具有副作⽤),⽽第⼆个操作应实现为GET。 它们都对posts集合进⾏操作,因此我们将使⽤端点/ posts 。让我们从插⼊帖⼦开始。 ⾸先我们要解析
// insert a post (using HTTP post method)
post("/posts", (request, response) -> {
try {
ObjectMapper mapper = new ObjectMapper();
NewPostPayload creation = adValue(request.body(), NewPostPayload.class);
if (!creation.isValid()) {
response.status(HTTP_BAD_REQUEST);
return "";
}
int id = Title(), Content(), Categories());
response.status(200);
return id;
} catch (JsonParseException jpe) {
response.status(HTTP_BAD_REQUEST);
return "";
}
});
然后查看如何检索所有帖⼦:
// get all post (using HTTP get method)
get("/posts", (request, response) -> {
response.status(200);
return AllPosts());
});
最后的代码是:
assetti;
import static ;
import static spark.Spark.post;
import com.JsonParseException;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论