如何封装c restful webservice Service

restful(5)
webservice(6)
java(77)
http://blog.csdn.net/jackfrued/article/details/
所谓Web Service是一个平台独立的,低耦合的,自包含的、可编程的Web应用程序,有了Web Service异构系统之间就可以通过XML或JSON来交换数据,这样就可以用于开发分布式的互操作的应用程序。Web Service使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件就可相互交换数据或集成,无论它们各自所使用的语言、平台或内部协议是什么,都可以相互交换数据。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。
REST(REpresentational State Transfer)是Roy Fielding博士于2000年在他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。近年来,越来越多的Web Service开始采用REST风格设计和实现。例如,亚马逊提供接近REST风格的Web Service进行图书查找;雅虎提供的Web Service也是REST风格的。
如果要对REST有更深入的了解和更深刻的认识,推荐大家阅读InfoQ上面的一篇文章《理解本真的REST架构风格》。相信很多自以为懂REST的人看完这篇文章之后才知道什么是真正的REST。在IBM的开发者社区中有一篇非常好的文章,名为《使用Spring 3来创建RESTful Web Services》,讲解如何用Spring Web和Spring MVC来创建REST风格的Web Service。由于这篇文章已经讲得很好了,这里我就不再赘述其中的内容。
/developerworks/cn/web/wa-spring3webserv/
这里要讲的是基于Apache CXF来创建RESTful Web Service。可以在Apache的网站下载到CXF的发行版本。Apache的官网是这样介绍CXF的:
&&& Apache CXF is an open source services framework. CXF helps you build and develop services using frontend programming APIs, like JAX-WS and JAX-RS. These services can speak a variety of protocols such as SOAP, XML/HTTP, RESTful HTTP, or CORBA and work over
a variety of transports such as HTTP, JMS or JBI.
下载完成后解压并找到lib目录,将其中的jar文件添加你的Java项目中,接下来就可以开始编写你的Web Service程序了。话不多说,直接上代码。
package com.lovo.
import javax.xml.bind.annotation.XmlRootE
@XmlRootElement(name = &Student&)
public class Student { &
&&& private I
&&& private S
&&& private S
&&& public Student() {
&&& public Student(Integer id, String name, String birthday) {
&&&&&&& this.id =
&&&&&&& this.name =
&&&&&&& this.birthday =
&&& public Integer getId() {
&&& public void setId(Integer id) {
&&&&&&& this.id =
&&& public String getName() {
&&& public void setName(String name) {
&&&&&&& this.name =
&&& public String getBirthday() {
&&& public void setBirthday(String birthday) {
&&&&&&& this.birthday =
package com.lovo.
import java.util.ArrayL
import java.util.HashM
import java.util.L
import java.util.M
import com.lovo.domain.S
public class StudentRepository {
&&& private Map&Integer, Student& map = new HashMap&&();
&&& public StudentRepository() {
&&&&&&& map.put(1001, new Student(1001, &骆昊&, &&));
&&&&&&& map.put(1002, new Student(1002, &王大锤&, &&));
&&&&&&& map.put(1003, new Student(1003, &张三丰&, &&));
&&& public void save(Student student) {
&&&&&&& if (student != null) {
&&&&&&&&&&& map.put(student.getId(), student);
&&& public void delete(Student student) {
&&&&&&& if (student != null && map.containsKey(student.getId())) {
&&&&&&&&&&& map.remove(student.getId());
&&& public void update(Student student) {
&&&&&&& delete(student);
&&&&&&& save(student);
&&& public Student findById(Integer id) {
&&&&&&& return map.get(id);
&&& public List&Student& findAll() {
&&&&&&& return new ArrayList&Student&(map.values());
package com.lovo.
import java.util.L
import javax.ws.rs.C
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.P
import javax.ws.rs.PathP
import javax.ws.rs.P
import com.lovo.domain.S
import com.lovo.infrastructure.StudentR
@Path(&/service&)
@Produces(&application/json&)
public class StudentService {
&&& private StudentRepository studentRepo = new StudentRepository();
&&& @Path(&/stu/{id}&)
&&& @Consumes(&application/json&)
&&& public Student getStudent(@PathParam(&id&) Integer id) {
&&&&&&& return studentRepo.findById(id);
&&& @Path(&/stu&)
&&& @Consumes(&application/json&)
&&& public List&Student& getAllStudents() {
&&&&&&& return studentRepo.findAll();
&&& @Path(&/stu&)
&&& @Consumes(&application/json&)
&&& public boolean addStudent(Student student) {
&&&&&&& if (getStudent(student.getId()) == null) {
&&&&&&&&&&& studentRepo.save(student);
&&&&&&&&&&&
&&& @Path(&/stu/{id}&)
&&& @Consumes(&application/json&)
&&& public boolean updateStudent(@PathParam(&id&) Integer id, Student student) {
&&&&&&& if (getStudent(id) != null) {
&&&&&&&&&&& studentRepo.update(student);
&&&&&&&&&&&
&&& @DELETE
&&& @Path(&/stu/{id}&)
&&& @Consumes(&application/json&)
&&& public boolean deleteStudent(@PathParam(&id&) Integer id) {
&&&&&&& Student student = getStudent(id);
&&&&&&& if (student != null) {
&&&&&&&&&&& studentRepo.delete(student);
&&&&&&&&&&&
最后来启动Web Service的服务器并进行测试。
package com.
import org.apache.cxf.jaxrs.JAXRSServerFactoryB
import com.lovo.domain.S
import com.lovo.service.StudentS
public class MyRestServer { &
&&& public static void main(String[] args) {
&&&&&&& JAXRSServerFactoryBean myRESTfulServer = new JAXRSServerFactoryBean();
&&&&&&& myRESTfulServer.setResourceClasses(Student.class); &
&&&&&&& myRESTfulServer.setServiceBean(new StudentService());
&&&&&&& myRESTfulServer.setAddress(&http://localhost:9999/&); &
&&&&&&& myRESTfulServer.create(); &
在浏览器中分别输入以下两个URI查看结果:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:560742次
积分:6604
积分:6604
排名:第2816名
原创:28篇
转载:580篇
评论:37条
(4)(10)(13)(12)(3)(12)(5)(8)(11)(2)(7)(2)(13)(13)(7)(10)(1)(2)(6)(5)(1)(6)(8)(14)(4)(7)(13)(12)(12)(11)(8)(8)(4)(9)(19)(29)(8)(8)(13)(16)(26)(7)(2)(4)(17)(22)(19)(9)(7)(17)(11)(6)(7)(7)(14)(13)(12)(2)(2)(4)(6)(1)(9)(7)(5)(6)(1)(1)(3)(4)(1)(1)(4)(1)10761人阅读
J2EE(11)
本文详细介绍了基于Spring创建一个“hello world” RESTful web service工程的步骤。
构建一个service,接收如下HTTP GET请求:
http://localhost:8080/greeting
并返回如下JSON格式的问候语:
{&id&:1,&content&:&Hello, World!&}
你也可以通过指定查询字符串中的可选参数name来定制问候语:
http://localhost:8080/greeting?name=User
参数name的值覆盖了默认值“World”,得到的响应为:
{&id&:1,&content&:&Hello, User!&}
大约15分钟一个文本编辑器或IDEJDK1.6或更高Gradle 1.8+或Maven 3.0+你也可以使用STS(Spring Tool Suite)直接import该工程
如同所有的Spring入门教程,你可以选择一步一步的自己实现,也可以跳过基本的设置步骤。最终,你都将得到一份可以正常运行的代码。
如果选择按步实现,继续下一节。
如果选择跳过基本的安装部分,则执行以下命令从github获取代码:
git clone /spring-guides/gs-rest-service.git
切换当前目录到gs-rest-service/initial,跳到Create a resource representation class步骤。
完成后,可以与gs-rest-service/complete中的代码对比一下,确保正确。
首先建立一个基本的构建脚本。基于Spring构建应用时,可以用使用任何的构建系统。这里我们以Gradle和Maven为例。如果不熟悉它们,请参考或者
建立目录结构
在你选定的工程目录下,建立如下子目录结构;例如,在*nix系统中使用mkdir&-p src/main/java/hello命令:
└── src
└── main
└── java
└── hello
创建Gradle构建文件
下面是初始的gradle构建文件。你也可以使用Maven,Maven的配置文件pom.xml可以参考。如果你使用STS(Spring Tool Suite),可以直接导入该工程。
build.gradle
buildscript {
repositories {
maven { url &http://repo.spring.io/libs-snapshot& }
mavenLocal()
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
baseName = 'gs-rest-service'
repositories {
mavenCentral()
maven { url &http://repo.spring.io/libs-snapshot& }
dependencies {
compile(&org.springframework.boot:spring-boot-starter-web:1.0.0.RC1&)
compile(&com.fasterxml.jackson.core:jackson-databind&)
testCompile(&junit:junit:4.11&)
task wrapper(type: Wrapper) {
gradleVersion = '1.8'
}注意:本文使用了。
创建资源描述类(Create a resource representation class)
现在已经建立了工程和构建系统,下面创建你的web service。
首先考虑服务间的交互(service interactions)。
这个服务要处理/greeting的GET请求,其查询字符串包含一个可选的name参数。这个GET请求应该一个200 OK的响应,以及JSON结构的描述问候语的内容。格式如下:
&content&: &Hello, World!&
id域是问候语的唯一标识,content域是问候语的文本描述。
为了对问候语的描述进行建模,创建了一个资源描述类。提供了一个包含域(id和content)、构造方法和访问器(getter和setter)的pojo(pain old java object)类:
src/main/java/hello/Greeting.java
public class Greeting {
private final S
public Greeting(long id, String content) {
this.content =
public long getId() {
public String getContent() {
注意:下面的步骤中,Spring使用了库将Greeting类型的实例编码成JSON格式。
下面创建资源控制器(resource controller)来发送这些问候语。
创建资源控制器(Create a resource controller)
采用Spring构建RESTful web services时,采用控制器处理HTTP请求。控制器组件通过@Controller注解来标识,下面的GreetingController类处理/greeting的GET请求,并返回一个Greeting类的新的实例:
src/main/java/hello/GreetingController.java
import java.util.concurrent.atomic.AtomicL
import org.springframework.stereotype.C
import org.springframework.web.bind.annotation.RequestM
import org.springframework.web.bind.annotation.RequestP
import org.springframework.web.bind.annotation.ResponseB
@Controller
public class GreetingController {
private static final String template = &Hello, %s!&;
private final AtomicLong counter = new AtomicLong();
@RequestMapping(&/greeting&)
public @ResponseBody Greeting greeting(
@RequestParam(value=&name&, required=false, defaultValue=&World&) String name) {
return new Greeting(counter.incrementAndGet(),
String.format(template, name));
这个controller很简单,但是其内部做了大量工作,麻雀虽小,五脏俱全。我们一步一步的解释。
@RequestMapping注解确保对/greeting的HTTP请求映射到greeting()方法。
注意:上述例子中没有写明GET、PUT、POST等等。这是因为@RequestMapping注解默认情况下映射所有的HTTP操作。使用@RequestMapping(method=GET)指定只映射GET请求。
@RequestParam把查询字符串中name参数的值绑定到greeting()方法的name参数上。该查询参数不是必须的(required=false);如果请求时没有指定该参数,则使用其默认值“World”(defaultValue)。
方法体的实现创建并返回了一个新的Greeting对象,该对象的id属性每次自增1,content属性采用template和name组合而来。
传统的MVC控制器和上述RESTful web service控制器的一个关键区别在于:HTTP响应体的创建方式。前者采用视图层技术()实现把服务器端的数据渲染为HTML,后者则返回一个Greeting对象。对象数据将会直接以JSON格式写到HTTP响应中。
通过以下方式实现上述功能,greeting()方法的@ResponseBody注解告诉Spring MVC不需要使用服务器端视图层渲染问候语对象(the greeting object),取而代之的是,返回的问候语对象时一个response body,而且应该直接写出。
Greeting对象必须转换成JSON格式。由于Spring支持HTTP报文转换,你不需要手工进行转换。由于在classpath中,因而Spring的会自动将Greeting实例转换为JSON格式。
Make the application executable
虽然可以将这个service打包成传统的文件,并部署到一个外部的应用服务器上,但是我们采用了一个更简单的方式:创建一个独立的(standalone)应用程序。把所有文件打包到一个可执行的JAR文件中,由古老的main()方法驱动。采用Spring提供的嵌入的
Servlet容器作为HTTP运行时环境,不需要部署一个外部的运行时环境实例。
src/main/java/hello/Application.java
import org.springframework.boot.autoconfigure.EnableAutoC
import org.springframework.boot.SpringA
import org.springframework.ponentS
@ComponentScan
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
main()方法调用了SpringApplication帮助类,把Application.class传递给它的run()方法作为参数。这样Spring就会去从Application读取注解,并作为的一个组件进行管理。
@ComponentScan注解告诉Spring递归地搜索hello包和其子包中直接或间接标记为@Component的类。这确保Spring发现并注册GreetingController,由于它被标记为@Controller,而@Controller是一类@Component注解。
@EnableAutoConfiguration注解基于你的classpath的内容打开合理的默认行为。例如,由于应用程序依赖于嵌入版的Tomcat(tomcat-embed-core.jar),一个Tomcat服务器会自动建立并进行合理的默认配置。应用程序也依赖于Spring MVC(spring-webmvc.jar),一个Spring MVC DispatcherServlet会为你配置和注册--不需要web.xml!自动配置(Auto-configuration)是一种强大的灵活的机制。详请参考。
构建可执行JAR(Build an executable JAR)
目前位置,Application类已经写完,下面通过构建系统把所有文件打包为一个可执行jar文件。这将便于对这个service在多种不同环境中进行发布、版本控制和部署。
下面是采用Gradle的步骤,如果采用Maven,可以在找到pom.xml文件,执行mvn clean package构建工程。
更新build.gradle文件的buildscript部分,如下:
buildscript {
repositories {
maven { url &http://repo.spring.io/libs-snapshot& }
mavenLocal()
dependencies {
classpath(&org.springframework.boot:spring-boot-gradle-plugin:1.0.0.RC1&)
再在build.gradle中添加如下语句:
apply plugin: 'spring-boot'
可以在看到最终版本的build.gradle文件。
Spring Boot gradle plugin收集classpath中的所有jar包,并构建一个单独的uber-jar,这使得更加便于执行和传输你的service。它也搜索public static void main()方法标志为一个可执行类。
下面执行如下命令生成一个单独的可执行JAR文件,该JAR文件包含所有必需的依赖的类和资源:
./gradlew build
如果你使用Gradle,可以使用如下语句执行生成的JAR文件:
java -jar build/libs/gs-rest-service-0.1.0.jar
如果使用Maven,使用如下语句:
java -jar target/gs-rest-service-0.1.0.jar
注意:上述过程将生成一个可执行JAR。你也可以选择。
执行(Run the service)
如果采用Gradle,可以在命令行中执行如下命令来运行你的service:
./gradlew clean build && java -jar build/libs/gs-rest-service-0.1.0.jar
注意:如果采用Maven,可以执行如下语句mvn clean package && java -jar target/gs-rest-service-0.1.0.jar
日志输出。service将会启动并在数秒钟内运行。
测试(Test the service)
现在service已经启动,访问http://localhost:8080/greeting,你会看到:
{&id&:1,&content&:&Hello, World!&}
查询字符串中指定一个name参数,如http://localhost:8080/greeting?name=User。content的值从“Hello, World!”变为“Hello, User!”:
{&id&:2,&content&:&Hello, User!&}
这说明GreetingController类中的@RequestParam注解起作用了。name参数给定的默认值为“World”,但是可以通过在查询字符串中设定值覆盖它。
注意id属性从1变为2。这表明你在多次请求中访问了同一个GreetingController实例,它的counter域每次访问时会自增1。
小结(Summary)
恭喜!你已经开发出了一个基于Spring的RESTful web service。
英文原文:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:890161次
积分:8959
积分:8959
排名:第1647名
原创:113篇
转载:25篇
译文:23篇
评论:162条
阅读:6193
(1)(1)(2)(1)(2)(1)(3)(1)(1)(1)(2)(2)(1)(2)(4)(1)(1)(3)(4)(2)(4)(1)(4)(16)(17)(4)(3)(8)(13)(8)(6)(11)(8)(19)(3)(1)急!.net怎么调用参数是JavaBean的Restfulwebservice。-.NET技术/WebServices-asp.net-电脑编程网急!.net怎么调用参数是JavaBean的Restfulwebservice。-.NET技术/WebServices作者:bluesev 和相关&&现在项目碰到一个问题,Restful webservice是用Java开发的,Java Team那边把所有的参数都封装成为JavaBean。但是我们的client端是.net开发的。我们在调用时怎么才能传递参数呀?因为不是SOAP的webservice,所以没有wsdl,我们在客户端没有办法生成Java Restful webservice所需要的JavaBean。各位高手有知道的吗?------回答---------------其他回答(50分)---------public string RESTfullRequest(string strURI, string strRequestBody)&
HttpWebResponse response =&
string strReturnValue = &&;&
bool hasError =&
string strRequestURI = STRIKEitURI + strURI;&
string strRequestType = &POST&;&
//string strHeaderXForwardedFor = &1.2.3.4&;&
string strContentType = &application/x-www-form-urlencoded&;&
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strRequestURI);&
request.Method = strRequestT&
//request.Headers.Add(&X-Forwarded-For&, strHeaderXForwardedFor);&
if ((pare(strRequestType, &POST&, true) == 0) || (pare(strRequestType, &PUT&, true) == 0))&
request.ContentType = strContentT&
ASCIIEncoding encoding = new ASCIIEncoding();&
string s = strRequestBody.Trim();&
byte[] bytes = encoding.GetBytes(s);&
request.ContentLength = s.L&
using (Stream stream = request.GetRequestStream())&
stream.Write(bytes, 0, bytes.Length);&
stream.Flush();&
stream.Close();&
response = (HttpWebResponse)request.GetResponse();&
catch (WebException ee)&
if (ee.Response != null)&
response = ee.Response as HttpWebR&
hasError =&
catch (Exception e)&
System.Diagnostics.Debug.Write(e);&
return &{\&Status\&:\&Error\&,\&ReturnCode\&:\&-1\&,\&Message\&:\&System error, please try again later.\&}&;&
using (Stream stream = response.GetResponseStream())&
if (stream.CanSeek)&
stream.Position = 0L;&
using (StreamReader reader = new StreamReader(stream, true))&
strReturnValue = reader.ReadToEnd();&
if (null != response)&
response.Close();&
if (hasError)&
ReturnMessage returnMessage = getReturnMessage&ReturnMessage&(strReturnValue);&
if (null == returnMessage.Message)&
returnMessage.Message=returnMessage.errorM&
return &{\&Status\&:\&Error\&,\&ReturnCode\&:\&-1\&,\&Message\&:\&& + returnMessage.Message + &\&}&;&
return strReturnV&
}
------回答---------------其他回答(50分)---------
public string RESTfullRequest(string strURI, string strRequestBody) &
HttpWebResponse response = &
string strReturnValue = &&; &
bool hasError = &
string strRequestURI = STRIKEitURI + strURI; &
string strRequestType = &POST&; &
//string strHeaderXForwardedFor = &1.2.3.4&; &
string strContentType = &application/x-www-form-urlencoded&; &
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strRequestURI); &
request.Method = strRequestT &
//request.Headers.Add(&X-Forwarded-For&, strHeaderXForwardedFor); &
if ((pare(strRequestType, &POST&, true) == 0) || (pare(strRequestType, &PUT&, true) == 0)) &
request.ContentType = strContentT &
ASCIIEncoding encoding = new ASCIIEncoding(); &
string s = strRequestBody.Trim(); &
byte[] bytes = encoding.GetBytes(s); &
request.ContentLength = s.L &
using (Stream stream = request.GetRequestStream()) &
stream.Write(bytes, 0, bytes.Length); &
stream.Flush(); &
stream.Close(); &
response = (HttpWebResponse)request.GetResponse(); &
catch (WebException ee) &
if (ee.Response != null) &
response = ee.Response as HttpWebR &
hasError = &
catch (Exception e) &
System.Diagnostics.Debug.Write(e); &
return &{\&Status\&:\&Error\&,\&ReturnCode\&:\&-1\&,\&Message\&:\&System error, please try again later.\&}&; &
using (Stream stream = response.GetResponseStream()) &
if (stream.CanSeek) &
stream.Position = 0L; &
using (StreamReader reader = new StreamReader(stream, true)) &
strReturnValue = reader.ReadToEnd(); &
if (null != response) &
response.Close(); &
if (hasError) &
ReturnMessage returnMessage = getReturnMessage&ReturnMessage&(strReturnValue); &
if (null == returnMessage.Message) &
returnMessage.Message=returnMessage.errorM &
return &{\&Status\&:\&Error\&,\&ReturnCode\&:\&-1\&,\&Message\&:\&& + returnMessage.Message + &\&}&; &
return strReturnV &
}
相关资料:|||||||急!.net怎么调用参数是JavaBean的Restfulwebservice。-.NET技术/WebServices来源网络,如有侵权请告知,即处理!编程Tags:                &                    }

我要回帖

更多关于 webservice封装成dll 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信