前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >java轻量RESTful api服务搭建(jersey+jetty)

java轻量RESTful api服务搭建(jersey+jetty)

原创
作者头像
vell001
发布于 2018-08-09 04:05:49
发布于 2018-08-09 04:05:49
3.1K0
举报
文章被收录于专栏:AI-vellAI-vell

前言

由于开始要搭建一个java + python的服务,java端提供数据库增删改查逻辑供python端调用,第一时间想到了用REST(Representational State Transfer)进行交互

最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了。REST的六个特性:Client-Server:服务器端与客户端分离。 Stateless(无状态):每次客户端请求必需包含完整的信息,换句话说,每一次请求都是独立的。 Cacheable(可缓存):服务器端必需指定哪些请求是可以缓存的。 Layered System(分层结构):服务器端与客户端通讯必需标准化,服务器的变更并不会影响客户端。 Uniform Interface(统一接口):客户端与服务器端的通讯方法必需是统一的。 Code on demand(按需执行代码?):服务器端可以在上下文中执行代码或者脚本?

以下就是我的简单尝试

正文

由于REST服务也是一个web服务,所以需要一个servlet容器

因为主逻辑还是在java端,所以希望这个REST服务非常轻量,选择一个轻量级的servlet容器很有必要,神马Tomcat、Resin就太重了,所以鼎鼎大名的 jetty 容器就是非常好的选择啦

容器选好了,就再考虑用什么RESTful框架实现咯,由于在java6上已经有了一套RESTful的api,叫:JAX-RS (Java API for RESTful Web Services),但JAX-RS 的具体实现由第三方提供,例如 Sun 的参考实现 Jersey、Apache 的 CXF 以及 JBoss 的 RESTEasy。各项性能比较不错的是Jersey和RESTEasy,各种百度google一番,最后任性的选择了Jersey

工具都选好了,开始干正事了,上代码:

首先配置下maven依赖:

代码语言:txt
AI代码解释
复制
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-servlet</artifactId>
            <version>1.19.4</version>
        </dependency>

        <!-- 对象自动转json -->
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-json</artifactId>
            <version>1.19.4</version>
        </dependency>

        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-client</artifactId>
            <version>1.19.4</version>
        </dependency>

        <dependency>
            <groupId>org.eclipse.jetty.aggregate</groupId>
            <artifactId>jetty-all-server</artifactId>
            <version>8.2.0.v20160908</version>
        </dependency>

再来写java代码:

代码语言:txt
AI代码解释
复制
/**
 * Copyright (C) 2017 The RDT of Wireless R&D in MIG. All right reversed. <p/> Created by vellhe on
 * 2017/7/7
 */

package com.tencent.awake.data.processing.service.rest;

import com.sun.jersey.spi.container.servlet.ServletContainer;
import com.tencent.awake.data.processing.db.mybatis.dao.model.SubTaskInfoPo;
import com.tencent.awake.data.processing.db.mybatis.dao.model.TaskInfoPo;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.util.Date;

/**
 * @author vellhe@tencent.com
 * @date 2017/7/7
 * @description 提供REST接口
 */
@Path("/")
public class RestInterface {

  /**
   * 根据id查询任务信息.
   *
   * @param id 任务id
   * @return 任务信息
   */
  @Path("/getTaskInfo/{id}") // 大括号里的是参数名,在函数位置使用@PathParam注解映射
  @GET // 声明这个接口必须GET访问
  @Produces(MediaType.APPLICATION_JSON) // 声明这个接口将以json格式返回
  public TaskInfoPo getTaskInfo(@PathParam("id") int id) {
    TaskInfoPo taskInfoPo = new TaskInfoPo();
    taskInfoPo.setId(id);
    taskInfoPo.setAppId("test");
    return taskInfoPo;
  }

  /**
   * 根据taskInfo查询subTaskInfo.
   *
   * @param taskInfoPo taskInfo
   * @return subTaskInfo
   */
  @Path("/getSubTaskInfo/") // url上没有参数,参数通过body传入
  @POST
  @Consumes(MediaType.APPLICATION_JSON) // 声明传入参数是json格式
  @Produces(MediaType.APPLICATION_JSON)
  public SubTaskInfoPo getSubTaskInfo(TaskInfoPo taskInfoPo) {
    SubTaskInfoPo subTaskInfoPo = new SubTaskInfoPo();
    subTaskInfoPo.setId((int) System.currentTimeMillis());
    subTaskInfoPo.setTaskId(taskInfoPo.getId());
    subTaskInfoPo.setCreateTime(new Date());
    return subTaskInfoPo;
  }

  /**
   * 测试用的main函数.
   */
  public static void main(String[] args) throws Exception {
    Server server = new Server(8282); // 监听8282端口
    ServletHolder servlet = new ServletHolder(ServletContainer.class);
    // 设置初始化参数
    servlet.setInitParameter("com.sun.jersey.config.property.resourceConfigClass", "com.sun.jersey.api.core.PackagesResourceConfig");
    servlet.setInitParameter("com.sun.jersey.config.property.packages", "com.tencent.awake.data.processing");
    servlet.setInitParameter("com.sun.jersey.api.json.POJOMappingFeature", "true"); // 自动将对象映射成json返回
    ServletContextHandler handler = new ServletContextHandler(ServletContextHandler.SESSIONS);
    handler.setContextPath("/");
    handler.addServlet(servlet, "/*");
    server.setHandler(handler);
    server.start();
    System.out.println("start...in 8282");
  }
}

大部分要说明的东西都在注解里可以找到了,就不一一讲解了,运行后会监听8282端口(代码里),这段demo代码提供了两个接口,所以来看看怎么请求这两个接口吧

我使用PostMan来模拟请求

getTaskInfo

getTaskInfo
getTaskInfo

getSubTaskInfo

getSubTaskInfo
getSubTaskInfo

DONE !!!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Jersey框架一:Jersey RESTful WebService框架简介[通俗易懂]
开发RESTful WebService意味着支持在多种媒体类型以及抽象底层的客户端-服务器通信细节,如果没有一个好的工具包可用,这将是一个困难的任务
全栈程序员站长
2022/09/29
1.7K0
使用 Jersey 调用 Restful 服务
第 20 章 Jersey - RESTful Web Services in Java. 目录 20.1. Client 20.1.1. Maven 版本 20.1.2. GET 操作 20.1.3. GET + Auth 用户认证 https://jersey.java.net/ 20.1. Client 20.1.1. Maven 版本 1.x <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-client --> <d
netkiller old
2018/03/05
1.6K0
JavaEE的RESTful标准技术JAX-RS,jersey-client客户端使用介绍【享学Java】
在Spring大行其道的今天,很多人对Java的RESTful规范JAX-RS可能比较陌生甚至未曾听闻,当然这也是能被“理解”的,毕竟Spring似乎现在已是JavaEE的事实标准。
YourBatman
2020/03/18
6.2K0
Jersey快速入门案例
Eclipse Jersey 是一个 REST 框架,提供了 JAX-RS (JSR-370) 的实现。
青山师
2023/05/05
5930
weblogic 10.x 上开发restful服务
之前已经学习过 利用JAX-RS快速开发RESTful 服务,当时是jboss环境,如果原封不动的迁移到weblogic 10.x 版本,会杯具的发现应用启动失败,需要做些小调整: 项目结构如下: 需
菩提树下的杨过
2018/01/24
6810
weblogic 10.x 上开发restful服务
webservice框架jersey简单总结[通俗易懂]
项目中需要使用到webservice,具体的是使用jersey。那么首先需要了解jersey和webservice的关系,捋顺webservice框架的各种实现,通过查阅相关博客,我个人总结webservice的结构图如下:
全栈程序员站长
2022/11/08
1K0
webservice框架jersey简单总结[通俗易懂]
分布式开发、基于Restful的WEB服务如何实现?
那么既然说到了分布式的开发,那么所有的开发者一定都会立刻联想到一个词:“慢”,对于传统的WEB服务开发(AXIS、XFire、CXF等),而且在编写的时候需要编写一大堆的客户端代码,这样对于整个程序的开发的复杂度还是非常高的,可是在实际的开发之中,如果你作为一个架构师,一定不可能将你一个项目的所有的子系统都设计为一个,中间一定会拆分成若干个子系统,于是这个若干个子系统之间如果要想进行数据的交互处理,只能够使用RPC。
爱明依
2019/03/12
5960
SpringBoot系列之基于Jersey实现文件上传API
在IDEA里new一个project,这里使用Spring Initializer快速创建一个SpringBoot项目,Server url可以使用Spring官网的,也可以使用阿里的,然后点击Next
SmileNicky
2023/08/14
6450
SpringBoot系列之基于Jersey实现文件上传API
restful接口定义_主板上的spi接口接什么
由于在实际项目中碰到的restful服务,参数都以json为准。这里我获取的接口和传入的参数都是json字符串类型。发布restful服务可参照文章http://www.cnblogs.com/jave1ove/p/7277861.html,以下接口调用基于此服务。
全栈程序员站长
2022/09/20
4190
区块链基础:基于Jetty实现小型HTTP服务
(2)get方法测试 http://localhost:8001/hello
程裕强
2022/05/06
5060
区块链基础:基于Jetty实现小型HTTP服务
从一次编译出发梳理概念: Jetty,Jersey,hk2,glassFish,Javax,Jakarta
最近在编译蚂蚁金服的sofa-registry,因为不可名状的原因,无法完全下载依赖的maven包,所以只能手动一个一个下载。事实证明,这是一个痛苦的过程,因为各种java包环环相扣,于是一个个java相关概念跃入眼帘。索性把这些概念一一梳理下,与大家分享。
罗西的思考
2020/09/22
2.7K0
Spring Boot与JAX-RS框架Jersey的完美搭配
Jeresy是一个轻量级的JAX-RS框架 添加Jeresy 2.x的依赖 compile group: 'org.glassfish.jersey.core', name: 'jersey-client', version: '2.26' compile group: 'org.glassfish.jersey.containers', name: 'jersey-container-servlet', version: '2.26' compile group: 'org.glassfish.j
白石
2019/08/23
2.8K0
揭秘:RESTEasy如何完美支持JAVA 微服务中的多种数据格式
本文获得stackify.com授权翻译发表,转载需要注明来自公众号EAWorld。
yuanyi928
2018/07/26
1.5K0
揭秘:RESTEasy如何完美支持JAVA 微服务中的多种数据格式
SpringBoot系列之集成Resteasy实现RESTFul接口
了解了Jboss的Easyrest后,我们通过一个文件上传的例子来搭建一个RESTFul项目,基于SpringBoot2.0,采用了开源的starter组件resteasy-spring-boot,GitHub链接:https://github.com/resteasy/resteasy-spring-boot
SmileNicky
2023/08/16
8160
SpringBoot系列之集成Resteasy实现RESTFul接口
使用Nginx代理restful实现SSL链路加密
1 目标说明 1.1 调研目的 本次调研主要为了解决两个问题: 不需要对restful的web容器做任何配置,实现对restful链路进行加密; 方便restful应用进行扩展,采用多个服务进行负载均
囚兔
2018/02/08
1.3K0
使用Nginx代理restful实现SSL链路加密
在dropwizard中使用feign,使用hystrix
前言 用惯了spring全家桶之后,试试dropwizard的Hello World也别有一帆风味。为了增强对外访问API的能力,需要引入open feign。这里简单在dropwizard中使用feign。 1. 什么Dropwizard Dropwizard is a Java framework for developing ops-friendly, high-performance, RESTful web services. Dropwizard使成熟、稳定的java生态系统更加简单、轻量(
Ryan-Miao
2018/03/14
1.9K0
java jersey使用总结_Java Jersey2使用总结
在短信平台一期工作中,为便于移动平台的开发,使用了Java Jersey框架开发RESTFul风格的Web Service接口。在使用的过程中发现了一些问题并积累了一些项目经验,做了一下总结,便于个人成长,同时也希望对有需要的同仁有好的借鉴和帮助。
全栈程序员站长
2022/09/14
1.3K0
spring rest 容易被忽视的后端服务 chunked 性能问题
spring boot 容易被忽视的后端服务 chunked 性能问题 标签(空格分隔): springboot springmvc chunked 背景 spring boot 创建的默认 spri
王清培
2018/01/05
2.4K0
java 利用JAX-RS快速开发RESTful 服务
JAX-RS(Java API for RESTful Web Services)同样也是JSR的一部分,详细规范定义见 https://jcp.org/en/jsr/detail?id=311 。从
菩提树下的杨过
2018/01/24
1.4K0
java 利用JAX-RS快速开发RESTful 服务
【Java】已解决:org.glassfish.jersey.server.ContainerException
已解决:org.glassfish.jersey.server.ContainerException
屿小夏
2024/09/07
2650
【Java】已解决:org.glassfish.jersey.server.ContainerException
推荐阅读
相关推荐
Jersey框架一:Jersey RESTful WebService框架简介[通俗易懂]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文