大家好,今天来为大家解答深入浅出:第四课——RESTful Web服务编程技巧与原理这个问题的一些问题点,包括也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
第1课:Java进阶与Socket通信实验第2课:Socket通信与HTTP服务器第3课:Java Web编程原理第4课:RESTful Webservice编程
Restful 服务端编程
Restful简介
RPC(Remote procedure Call Protocol),即远程过程调用进程间通信的技术。一开始,计算机的各个进程之间是无法通信的。为了让进程之间能够进行通信,发明了IPC(Inter-process communications,单机上运行的进程之间的进程间通信)技术。随着互联网的出现,人们将IPC扩展为RPC,从而实现了不同机器之间的进程通信。
然而,实现RPC是很麻烦的。为了使RPC 变得简单,程序员发明了各种框架。 Restful是高效、简单、易用的架构风格之一。
REST是一种架构风格,其核心是面向资源的。 REST专门针对网络应用程序设计和开发,以降低开发的复杂性,提高系统的可扩展性。 REST 提出的设计理念和指南如下:
1.网络上的一切都可以抽象为资源
2. 每个资源都有一个唯一的资源标识符,对资源的操作不会改变这些标识符。
3.所有操作都是无状态的
REST简化了开发,其架构遵循CRUD原则,这告诉我们资源(包括网络资源)只需要创建、获取、更新和删除四种行为即可完成相关操作和处理。您可以通过统一资源标识符(URI) 来识别和定位资源,并且对这些资源执行的操作是通过HTTP 规范定义的。其核心操作只有GET、PUT、POST、DELETE。
由于REST 强制所有操作都是无状态的,因此没有上下文约束。如果是分布式的,集群不需要考虑上下文和会话保留问题。大大提高了系统的可扩展性。
关于SOAP Webservice和Restful Webservice之间的选择,首先要明白的是,SOAP倾向于面向活动,有严格的规范和标准,包括安全、事务等方面。同时,SOAP强调操作方法和操作对象的分离,有WSDL文件规范和XSD文件分别定义它们。 REST强调资源导向。只要我们想要操作的对象能够抽象成资源,我们就可以使用REST架构风格。
参考:
http://blog.csdn.net/lilongsheng1125/article/details/41643665
https://www.zhihu.com/question/25536695
CXF Restful Service 基础
正在下载包,比如最新的apache-cxf-3.1.7-src.zip。然后将其解压缩到您选择的文件夹中。比如我把它放在桌面上。
apache-cxf-3.1.7-src中有很多文件。我们正在寻找的是一个样本。我们打开神奇的IntelliJ IDEA,然后导入项目。找到路径apache-cxf-3.1.7-srcdistributionsrcmainreleasesamplesjax_rsbasic。然后双击pom.xml。然后继续按下一步打开项目。
打开项目,和上次一样,找到右边的框,输入命令:
install:安装,会看到产品放入本地仓库-Pserver:运行服务器,程序会自动启动jetty -Pclient:运行客户端程序我们只需要分别运行install和-Pserver即可。然后,在浏览器中输入URL:http://localhost:9000/customerservice/customers/123。我们看到运行的结果。
运行结果返回universal xml。那么简单的程序体验到这里就结束了。
CXF 与 spring 集成
Maven创建一个web项目:选择maven-archetype-webapp,然后输入:
groupId: me.cxf-样本
artifactId: cxf-rs-spring 项目名称为cxf-rs-spring。
然后我们在主文件夹中创建一个java文件夹并将其设置为Source Root。然后添加Java 包并将其命名为demo.jaxrs.server。
添加Java包,然后将刚才demo中的Customer.java、CustomerService.java、Product.java、Order.java拖入包中。
这时候我发现没有rs包。
如果没有rs包,我们添加依赖:
javax.ws.rsjavax.ws.rs-api2.0.1 根据系统文档配置src/main/webapp/WEB-INF/web.xml
cxf-rs-spring Maven WebappcontextConfigLocationWEB-INF/beans.xmlorg.springframework.web.context.ContextLoaderListenerorg.springframework.web.util.IntrospectorCleanupListenerCXFServletorg.apache.cxf.transport.servlet.CXFServletCXFServlet/*在.xml和同一个文件夹中创建bean继续配置
创建beans.xml?xml version="1.0"encoding="UTF-8"?最后我们配置pom.xml。然后导入需要的包。
4.0.0me.cxf-samplecxf-rs-springwar1.0-SNAPSHOTcxf-rs-spring Maven Webapphttp://maven.apache.org9.3.7.v201601153.1.6junitjunit3.8.1testjavax.ws.rsjavax.ws.rs-api2.0.1org.apache .cxfcxf-rt-transports-http${cxf.version}org.apache.cxfcxf-rt-frontend-jaxrs${cxf.version}org.apache.cxfcxf-rt-rs-service-description${cxf.version} org.springframeworkspring-web3.2.8.RELEASEcxf-rs-springorg.eclipse.jettyjetty-maven-plugin${jettyVersion}最后用jetty:run启动服务器。然后在浏览器中输入:http://localhost:8080/和http://localhost:8080/service1/customerservice/customers/123即可看到效果。
如果我们输入http://localhost:8080/service1?_wadl,我们可以看到服务接口的定义。
我在做的时候出现了如下问题,服务器无法启动。找了半天,原来是我运行apache的时候服务器没有关闭。所以只要关闭服务器就可以了。
[信息] Jetty 服务器退出。
[信息] ---------------------------------------------------------- --- --------------------------
[信息] 构建失败
[信息] ---------------------------------------------------------- --- --------------------------
[INFO] 总时间: 12.110s
[INFO] 于: 于9 月27 日星期二22:13:51 CST 2016 完成
[信息]最终内存: 25M/249M
[信息] ---------------------------------------------------------- --- --------------------------
[错误] 无法在项目cxf-rs-spring: 上执行目标org.eclipse.jetty:jetty-maven-plugin:9.3.7.v20160115:run (default-cli) 失败: 地址已在使用: 绑定-[帮助1]
[错误]
[错误] 要查看错误的完整堆栈跟踪,请使用-e 开关重新运行Maven。
[错误] 使用-X 开关重新运行Maven 以启用完整的调试日志记录。
[错误]
[ERROR] 有关错误和可能的解决方案的更多信息,请阅读以下文章:
[错误] [帮助1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
JAX-RS 服务端编程
复制cxf-rs-spring 文件夹并将其重命名为cxf-rs-spring-test。然后进入pom.xml,将原来的cxf-rs-spring改为cxf-rs-spring-test。
然后我们用IntelliJ IDEA 打开这个文件。在java文件夹下创建org.me.examples.helloworld,然后在该包下创建Hello.java。
使用以下代码:
包org.me.examples.helloworld;
导入javax.ws.rs.GET;
导入javax.ws.rs.Path;
导入javax.ws.rs.PathParam;
导入javax.ws.rs.Produces;
@Path("/你好/{用户名}")
公共课你好{
@得到
@Produces("文本/xml")
公共字符串sayHello(@PathParam("用户名") 字符串用户名) {
返回“你好”+用户名;
}
然后稍微修改beans.xml文件的关键部分。
然后我们使用命令行,输入命令:curl http://localhost:8080/service1/hello/Monkey。
效果如下:
渲染返回“hello Monkey”,表示成功。
习题部分
RESTful Webservice作为远程调用(RPC),它的输入是什么?输入是什么?
REST的核心是URL和面向资源。用URL代替原来复杂的操作方式,简化为GET、PUT、POST、DELETE四个核心操作。一个URL对应一个资源。因此,我们可以认为输入是URL,输出是资源(例如Json或xml)。
有一个Java 远程函数声明public Customer getCustomer(String id)。要将HTTP协议输入/输出映射到该函数,至少必须注释哪些信息?请写出这些注释并简要说明协议和功能之间的关系。
@得到
@Path("/customers/{id}/") 将实验1的@Path改为@Path(“/myservice/”),请使用curl -v给出结果
我们将@Path("/customerservice/") 更改为@Path("/myservice/")。我们知道@Path("/customerservice/")表示访问该类的项目根的URI路径。如果我们将其更改为myservice,则URL 也会更改为http://localhost:9000/myservice/customers/123。同样的,如果我们改变@Path("/customers/.")部分,对应的URL也会改变。否则会显示404。实验结果如下:
实验结果简述GET和POST的区别
Http获取资源有四个核心操作:GET、POST、PUT、DELETE,分别对应对这个资源的查看、修改、添加、删除四种操作。因此,原则上GET方法获取到的信息是不能被修改的,而POST则意味着资源可以被修改。
从表面上看,GET和POST的区别如下:
GET请求的数据会被追加到URL中(即数据放在HTTP协议头中),POST提交的数据则放在HTTP包体中。 GET方法提交的数据最多只能是1024字节(因为GET使用URL提交数据,关键在于浏览器对URL的支持)。理论上来说,POST没有限制,可以传输较大量的数据(实际上出于安全考虑,也有相应的限制)。使用不同技术进行编程时,GET 和POST 的使用方式有所不同。 POST 比GET 更安全。例如:通过GET提交数据时,用户名和密码会以明文形式出现在URL上,因为(1)登录页面可能被浏览器缓存,(2)其他人查看了浏览器的历史记录,那么其他人就可以获取您的帐户和密码。另外,使用GET提交数据还可能导致跨站请求伪造攻击。参考:
http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html
在实际应用程序中使用Mapcustomers 是否有任何副作用?为什么?
在多线程编程过程中,可能会出现副作用。两个用户可以同时请求相同的ID。所以尽量避免这种情况。
Spring IOC和DI是java编程的核心内容之一。阅读Spring IoC使用详解,用自己的语言解释IoC解耦的原理。
IoC 通过依赖注入以及使用set 或构造函数方法来实现解耦。也就是说,如果要修改某个接口的实现,就必须修改里面的内容。使用依赖注入,你只需要设置它。
(!)使用Maven构建(6)中给出的案例,项目名称IOC_test
……
Spring实验中,读取beans.xml,写出声明根资源的关键内容。
(!)尝试编写一个根资源类Hello,并使用GET方法来实现String SayHello()远程服务。请提供Hello类代码,添加根资源配置(不是修改)XML内容,以及curl测试结果。
包org.me.examples.helloworld;
导入javax.ws.rs.GET;
导入javax.ws.rs.Path;
导入javax.ws.rs.PathParam;
导入javax.ws.rs.Produces;
@Path("/你好/{用户名}")
公共课你好{
@得到
@Produces("文本/xml")
公共字符串sayHello(@PathParam("用户名") 字符串用户名) {
返回“你好”+用户名;
}
}WADL 的全名。从程序结果返回中提取WADL内容。
WADL全称Web Application Description Language,即Web应用程序描述语言。
Request 的Header 段中的哪个Field 决定了实验返回的WADL 输出对象的格式协商?
接受:application/xml
JAX-RS的全称
JAX-RS,Java API for RESTful Web Services,是Java 编程语言的应用程序编程接口,支持根据表述性状态传输(REST) 架构风格创建Web 服务。
@Produces 和@Consumes 的作用
@产品:
用于指定输出格式,参数可以是字符串数组。如果是数组,则第一个为默认输出格式。如果客户端指定了一个输出,则将匹配其他输出。例如:
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})@Consumes:
指定处理输入媒体的类型,例如“Content-Type: application/json”。如果您的服务中的函数具有自由参数,请指定适当的输入提供程序并使用正文中的内容来实例化该参数。例如:
@邮政
@Consumes("文本/纯文本")
@Produces("文本/xml")
public String sayHello(@PathParam("用户名") String userName, String letter) {
return "你好" + 用户名+ ":" + 字母;
文章分享结束,深入浅出:第四课——RESTful Web服务编程技巧与原理和的答案你都知道了吗?欢迎再次光临本站哦!
【深入浅出:第四课——RESTful Web服务编程技巧与原理】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
我开始学习 API ,这个教程看起来很棒!
有19位网友表示赞同!
以前没接触过 RESTful ,这课能让我了解一下吗?
有17位网友表示赞同!
想学怎么设计高效的接口,这课合适吗?
有14位网友表示赞同!
有没有什么资料可以提前预习一下第四課の内容呢?
有13位网友表示赞同!
学习构建 Web 服务很实用啊,准备好好跟着教程来一遍。
有5位网友表示赞同!
希望这课能详细讲解一些 RESTful 的原则。
有8位网友表示赞同!
最近做项目遇到接口的问题,不知道这个课程能不能解决。
有6位网友表示赞同!
对 Restful API 感觉很新奇,期待深入了解!
有9位网友表示赞同!
学习 Webservice 实战经验总是很有用的啊!
有19位网友表示赞同!
要学 RESTful , 这课是重点了, 不想落下进度!
有10位网友表示赞同!
希望这课能涵盖不同类型的 HTTP 方法的用法。
有13位网友表示赞同!
感觉学习 RESTful 可以让代码更结构化一些。
有8位网友表示赞同!
看了课程目录 ,觉得第四課内容很吸引人!
有10位网友表示赞同!
这个教程是不是跟着软件项目一起进行教学的?
有7位网友表示赞同!
学习 Web Service 的时候,有哪些需要注意的地方呢?
有18位网友表示赞同!
想学 RESTful 来构建自己的个人项目!
有15位网友表示赞同!
期待这课能讲解一些实用的 API 示例代码。
有20位网友表示赞同!
希望课程能够清晰地解释 JSON 格式的使用。
有17位网友表示赞同!
学习完第四課,可以开发什么样的 Web 应用呢?
有6位网友表示赞同!
感觉 RESTful 能让我更好地理解大型项目的架构设计!
有11位网友表示赞同!