【整理】Spring Rest接口开发专题

1 开发技巧

      主要参考链接:

        跟着笨鸟一步一步学习spring开发(二、学习springrest接口开发)

        http://www.kuqin.com/shuoit/20140615/340586.html

        理解RESTful架构:《理解RESTful架构》

        RESTful API 设计指南:http://www.ruanyifeng.com/blog/2014/05/restful_api.html

1.1 功能实现目标

接下来我们要做什么

        我们会创建一个接收http get请求的web服务:

        http://localhost:8080/greeting

        然后服务器会给我们返回一个json字符串的问候内容:

            {"id":1,"content":"Hello,World!"}

        阮一峰也有一篇介绍JSON的文章:

        数据类型和JSON格式:http://www.ruanyifeng.com/blog/2009/05/data_types_and_json.html

        我们也可以在问候请求查询字符串(url)中个性化的添加一个可选的name参数:

            http://localhost:8080/greeting?name=shfq

        ps:我叫石锋强,shfq是我姓名的简称。

        name参数的值会覆盖掉默认值world,最终会反映到响应结果中:

            {"id":1,"content":"Hello,shfq!"}

1.2 开发环境

    我们还需要什么?

        15分钟的时间

        一个喜欢的文本编辑器或者是一个IDE

        JDK1.6或者是更高版本

        Gradle1.1或者更高版本或者是Maven3.0或者更高版本

        ps:Gradle也是类似Maven的一种Java构建工具,本人没有用过,仅Google过相关介绍资料

1.3 开发步骤

1.3.1 工程搭建

接下来我们开始搭建工程

我用的IDE是IntellJ IDEA12.1.4,构建工具是Maven,工程结构如图:

1.3.2 接口请求过程

        首先创建一个代表资源(向我们问候的一个字符串)的类Greeting,接下来我们将要创建一个工程然后搭建一个系统,创建web 服务。

        在开始之前,让我们思考一下整个服务交互的过程:

        web服务会处理带有/greeting的GET请求的查询字符串(就是一个url),我们还可以加一个可选的name参数。

        在正常情况下GET请求会返回一个 200 的状态码表示一切OK和一个响应体,响应体有一个代表问候的JSON字符串。形如这样的一个问候的字符串:

{

    "id":1,

    "content":"Hello,World!"

}

        id这个字段唯一的对应着服务器对客户端请求的一个响应(任何一次向服务器的请求都会产生一个新的id),content代表服务器端向客户端响应的内容,就是问候的一句话。

1.3.3 请求结果对象VO

        为了建立一个问候的模型,我们创建一个代表资源的类,提供一个包含两个字段、一个构造方法、还有对id、content的访问方法的简单而古老的Java对象。

src/main/java/hello/Greeting.java

package hello;

public class Greeting

{

    privatefinallongid;

    private final String content;

    public Greeting (long id, String content)

    {

            this.id=id;

            this.content=content;

    }

    public long getId(){

            returnid;

    }

    public String getContent(){

            returncontent;

    }

}

        注意:我们将会在接下来的描述过程中,看到Spring使用Jackson JSON库来自动地将Greeting类型转化为JSON字符串。

1.3.4 创建一个请求控制器类

        接下来我们将会创建一个资源控制器,这个资源控制器将负责处理客户端向服务器发送的问候请求。

        创建一个资源控制器

        在Spring创建的rest接口web服务中,http请求是被控制器处理的。这些组件(一个控制器就是一个组件)很容易地被@Controller注解标识,下面的GreetingController处理了一个含有/greeting的一个字符串的GET请求,并对每次请求都返回给了客户端一个新的Greeting实例。

src/main/java/hello/GreetingController.java

package hello;

import java.util.concurrent.atomic.AtomicLong;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.ResponseBody;

@Controller

public class GreetingController

{

    private static final String template = "Hello,%s!";

    private final AtomicLong counter = new AtomicLong();

    @RequestMapping("/greeting")

    @ResponseBody

    @RequestParam(value="name", required=false,defaultValue="World")

    public Greeting greeting(String name)

    {

            returnnew Greeting(counter.incrementAndGet(), String.format(template, name));

    }

}

        这个控制器简单而简洁,但在这背后仍然有许多值得我们探究的东西,下面我们将会一步一步的来分解、分析它。

        @RequestMapping(@RequestMapping(“/greeting”))注解能保证带有/greeting的http请求将会映射到greeting()方法中。

        注意:在上面的例子中并没有指定GET、PUT、POST等http请求方法的类型,因为:

            @RequestMapping默认会映射所有的http操作请求。

            @RequestMapping(method=GET)只会映射http GET请求方法。

            @RequestMapping绑定了查询参数name中的值到greeting(String

name)方法中的name。

        查询字符串中的name参数是可选的,如果在查询请求字符串中缺少了name参数,defaultValue

“World”将会派上用场。

        在方法体的实现中,创建了一个Greeting对象并返回。这个Greeting对象有id、content两个属性,其中id是基于counter自增后的值,content是被name参数使用了问候的模板格式化了。

        传统的Spring MVC控制器和Spring rest接口web服务中的控制器有个关键的不同,在Spring rest接口中,响应内容是在控制器中创建的(在本控制器中创建并返回的Greeting就是响应内容,最终被转化成了一个JSON字符串),而在传统的Spring MVC开发中的控制器中返回的一般是一个字符串(见),这个字符串会与一个jsp或者是html文件匹配,而这个文件就是MVC中的view视图。而不是依靠视图技术在服务器端把表现问候的数据转换为HTML,rest接口web服务的控制器仅仅是简单的new一个Greeting对象并返回。这个对象将会转化为JSON格式直接地写给HTTP响应。为了完成这一切,在greeting()方法上的@ResponseBody 注解会告诉spring MVC不需要通过服务器端视图层把问候的Greeting对象来表现,而是把打招呼的Greeting返回作为响应体直接写出。从greeting()方法中新建并返回的Greeting对象一定要转化成JSON对象。幸亏Spring的HTTP消息转化器的支持,我们不需要自己人工转化。因为Jackson 2 在classpath中,Spring的MappingJackson2HttpMessageConverter会自动选择将Greeting实例对象转化为JSON格式的字符串。

1.3.5 使这个应用可执行化

        尽管可以把这个服务打包为一个传统的war文件来部署到一个外部的应用服务器上。下面创建了一个孤立的应用,可以相对简单的来演示。我们把所有的都打包成一个可执行的JAR包,被一个古老而好用的main()方法驱动。顺着这条路,我们用Spring对内置的tomcat servlet容器的支持来作为http运行时,而不是作为一个外部的实例来部署。

src/main/java/hello/Application.java

package hello;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;

import org.springframework.boot.SpringApplication;

import org.springframework.context.annotation.ComponentScan;

@ComponentScan

@EnableAutoConfiguration

public class Application

{


    public static void main(String[] args)

    {

            Spring Application.run(Application.class,args);

    }

}

        main()方法听从SpringApplication帮助类,提供Application.class作为一个参数传递给SpringApplication的run()方法。这样一来,Spring就知道从Application类文件中读取annotation注解元数据,并在Spring 应用上下文中作为一个组件来管理。

        @ComponentScan 注解会告诉Spring递归搜索 hello 包和它的子路径下直接或者是间接地标记了Spring的@Component注解的类。这直接保证了Spring能找到并注册@GreetingController,因为它被@Controller注解标记,@Controller反过来也会作为一种@Component注解。

        @EnableAutoConfiguration注解会转化基于classpath上的合理内容。例如,咱们刚才创建的依赖于tomcat-embed-core.jar包内置的tomcat版本的这个应用,tomcat服务器启动中会站在我们的立场上为我们配置一些合理的默认值。

        因为应用也依靠Spring MVC(spring-webmvc.jar),在不需要web.xml的情况下为你配置和注册了一个Spring MVC DispatcherServlet。Auto-configuration是一种强大、灵活的机制。查看API 文档可以了解更详细的情况。

1.3.6 测试服务

        服务启动以后,访问http://localhost:8080/greeting,你将会看到返回数据。

        我们也可以在查询字符串中加一个参数http://localhost:8080/greeting?name=User。我们会发现content的值将由"Hello,World!"变为"HelloUser!"这个变化体现出了在GreetingController中的@RequestParam注解的安排正如我们期望的一样。

         name参数已经给了一个默认的值"World",但是我们可以通过在查询字符串中显示的指定一个参数值来覆盖掉默认值。

        注意id属性怎样就从1变为2了。这就证明了我们的多次请求是在同一个GreetingController的实例处理的,GreetingController的counter字段正如我们期望的那样在每次访问后都加1。

1.4 总结

        恭喜我们,我们已经用Spring开发完了一个rest接口web服务(也恭喜我终于翻译完了,从前天晚上开始翻译,中途有停顿,到现在终于翻译完了,收收获还是挺大的, 在翻译的过程中注意到了很多细节的地方,如果只是阅读可能就不会注意到某些方面了)。

2 参考链接

跟着笨鸟一步一步学习spring开发(二、学习springrest接口开发)

http://www.kuqin.com/shuoit/20140615/340586.html

【REST】REST、RESTFUL的理解以及SpringMVC实现Restful编程

http://m.blog.csdn.net/article/details?id=49756991

REST在Java中的使用

http://www.tuicool.com/articles/3QBZjqB

spring mvc(2):请求地址映射(@RequestMapping)

http://www.blogjava.net/fancydeepin/archive/2014/08/15/springmvc-tutorial-02.html

@RequestMapping用法详解之地址映射(转)

http://www.cnblogs.com/qq78292959/p/3760560.html

Spring REST实践之客户端和测试

http://www.cnblogs.com/coderland/p/5903000.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,803评论 6 342
  • 要加“m”说明是MB,否则就是KB了. -Xms:初始值 -Xmx:最大值 -Xmn:最小值 java -Xms8...
    dadong0505阅读 4,829评论 0 53
  • 「复次,须菩提,善男子,善女人,受持读诵此经,若为人轻贱,是人先世罪业应堕恶道,以今世人轻贱故,先世罪业则为消灭,...
    Iris621阅读 182评论 0 1
  • 土木建筑学院风景园林1601班认识实习 为期五天 分别参观的地点有:①银川西部影视城②三沙源③森林公园④文化园⑤...
    SexisZero阅读 433评论 0 0