java輕量RESTful api服務搭建(jersey+jetty)

前言

由于開始要搭建一個java + python的服務,java端提供數據庫增刪改查邏輯供python端調用牌芋,第一時間想到了用REST(Representational State Transfer)進行交互

最近這些年,REST已經成為web services和APIs的標準架構,很多APP的架構基本上是使用RESTful的形式了扁凛。

REST的六個特性:

  • Client-Server:服務器端與客戶端分離。
  • Stateless(無狀態(tài)):每次客戶端請求必需包含完整的信息闯传,換句話說绕沈,每一次請求都是獨立的。
  • Cacheable(可緩存):服務器端必需指定哪些請求是可以緩存的泡躯。
  • Layered System(分層結構):服務器端與客戶端通訊必需標準化祖娘,服務器的變更并不會影響客戶端。
  • Uniform Interface(統(tǒng)一接口):客戶端與服務器端的通訊方法必需是統(tǒng)一的妹窖。
  • Code on demand(按需執(zhí)行代碼纬朝?):服務器端可以在上下文中執(zhí)行代碼或者腳本?

以下就是我的簡單嘗試

正文

由于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依賴:

        <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代碼:


/**
 * 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); // 監(jiān)聽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");
  }
}

大部分要說明的東西都在注解里可以找到了倒庵,就不一一講解了,運行后會監(jiān)聽8282端口(代碼里)噩咪,這段demo代碼提供了兩個接口胃碾,所以來看看怎么請求這兩個接口吧
我使用PostMan來模擬請求

getTaskInfo

getTaskInfo

getSubTaskInfo

getSubTaskInfo

DONE !!!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市栈源,隨后出現的幾起案子甚垦,更是在濱河造成了極大的恐慌,老刑警劉巖迄埃,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異兑障,居然都是意外死亡侄非,警方通過查閱死者的電腦和手機蕉汪,發(fā)現死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逞怨,“玉大人者疤,你說我怎么就攤上這事〉猓” “怎么了驹马?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長除秀。 經常有香客問我糯累,道長,這世上最難降的妖魔是什么鳞仙? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任寇蚊,我火速辦了婚禮,結果婚禮上棍好,老公的妹妹穿的比我還像新娘仗岸。我一直安慰自己,他們只是感情好借笙,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布扒怖。 她就那樣靜靜地躺著,像睡著了一般业稼。 火紅的嫁衣襯著肌膚如雪盗痒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天低散,我揣著相機與錄音俯邓,去河邊找鬼。 笑死熔号,一個胖子當著我的面吹牛稽鞭,可吹牛的內容都是我干的。 我是一名探鬼主播引镊,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼朦蕴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了弟头?” 一聲冷哼從身側響起吩抓,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赴恨,沒想到半個月后疹娶,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡伦连,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年蚓胸,在試婚紗的時候發(fā)現自己被綠了挣饥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡沛膳,死狀恐怖,靈堂內的尸體忽然破棺而出汛聚,到底是詐尸還是另有隱情锹安,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布倚舀,位于F島的核電站叹哭,受9級特大地震影響,放射性物質發(fā)生泄漏痕貌。R本人自食惡果不足惜风罩,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望舵稠。 院中可真熱鬧超升,春花似錦、人聲如沸哺徊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽落追。三九已至盈滴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間轿钠,已是汗流浹背巢钓。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疗垛,地道東北人症汹。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像继谚,于是被迫代替她去往敵國和親烈菌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理花履,服務發(fā)現芽世,斷路器,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評論 6 342
  • 天竹之云羽閱讀 209評論 0 0
  • -1- 哪種姑娘是好姑娘诡壁? 那種上的廳堂济瓢,下的廚房,善解人意妹卿,溫柔賢惠的姑娘絕對...
    樹獺先生閱讀 7,231評論 167 282
  • 過了20多個秋天旺矾,今年的秋天和每年一樣蔑鹦,并沒有什么特別。特別的是那年... 1.小n那年很瘦箕宙,好似一陣清風就...
    海汐兒閱讀 224評論 0 1