A. 如何在java中 提供 RESTful Web 服务
通过REST风格体系架构,请求和响应都是基于资源表示的传输来构建的。资源是通过全局ID来标识的,这些ID一般使用的是一个统一资源标识符(URI)。客户端应用使用HTTP方法(如,GET、POST、PUT或DELETE)来操作一个或多个资源。通常,GET是用于获取或列出一个或多个资源,POST用于创建,PUT用于更新或替换,而DELETE则用于删除资源。
例如,GET http //host/context/employees/12345将获取ID为12345的员工的表示。这个响应表示可以是包含详细的员工信息的XML或ATOM,或者是具有更好UI的JSP/HTML页面。您看到哪种表示方式取决于服务器端实现和您的客户端请求的MIME类型。
RESTful Web Service是一个使用HTTP和REST原理实现的Web Service。通常,一个RESTful Web Service将定义基本资源URI、它所支持的表示/响应MIME,以及它所支持的操作。
本文将介绍如何使用Spring创建Java实现的服务器端RESTful Web Services。这个例子将使用浏览器、curl和Firefox插件RESTClient作为发出请求的客户端。
本文假定您是熟悉REST基本知识的。
Spring 3的REST支持
在Spring框架支持REST之前,人们会使用其他几种实现技术来创建Java RESTful Web Services,如Restlet、RestEasy和Jersey。Jersey是其中最值得注意的,它是JAX-RS(JSR 311)的参考实现。
Spring是一个得到广泛应用的Java EE框架,它在版本3以后就增加了RESTful Web Services开发的支持。虽然,对REST的支持并不是JAX-RS的一种实现,但是它具有比标准定义更多的特性。REST支持被无缝整合到Spring的MVC层,它可以很容易应用到使用Spring构建的应用中。
Spring REST支持的主要特性包括:
注释,如@RequestMapping 和 @PathVariable,支持资源标识和URL映射
支持为不同的MIME/内容类型使用不同的表示方式
使用相似的编程模型无缝地整合到原始的 MVC 层
创建一个示例RESTful Web Service
本节中的例子将演示Spring 3环境的创建过程,并创建一个可以部署到Tomcat中的“Hello World”应用。然后我们再完成一个更复杂的应用来了解Spring 3 REST支持的重要概念,如多种MIME类型表示支持和JAXB支持。另外,本文还使用一些代码片断来帮助理解这些概念。
Hello World:使用Spring 3 REST支持
要创建这个例子所使用的开发环境,您需要:
IDE:Eclipse IDE for JEE (v3.4+)
Java SE5 以上
Web 容器:Apache Tomcat 6.0(Jetty或其他容器也可)
Spring 3框架(v3.0.3是本文编写时的最新版本)
其他程序库:JAXB 2、JSTL、commons-logging
在 Eclipse 中创建一个Web应用,然后设置Tomcat 6作为它的运行环境。然后,您需要设置web.xml文件来激活Spring
WebApplicationContext。这个例子将Spring bean配置分成两个文件:rest-servlet.xml 包含与MVC/REST有关的配置,rest-context.xml包含服务级别的配置(如数据源 beans)。清单 1 显示了web.xml中的Spring配置的部分。
清单 1. 在web.xml中激活Spring WebApplicationContext
以下是引用片段:
contextConfigLocation
/WEB-INF/rest-context.xml
<!-- This listener will load other application context file in addition to
rest-servlet.xml -->
org.springframework.web.context.ContextLoaderListener
rest
org.springframework.web.servlet.DispatcherServlet
1
rest
/service/*
在rest-servlet.xml文件中创建Spring MVC的相关配置(Controller、View、View Resolver)。清单 2 显示了其中最重要的部分。
清单 2. 在rest-servlet.xml文件中创建Spring MVC配置
以下是引用片段:
<bean class="org.springframework.web.servlet.mvc.annotation
." />
<bean class="org.springframework.web.servlet.mvc.annotation
." />
<bean id="jaxbMarshaller"
class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
dw.spring3.rest.bean.Employee
dw.spring3.rest.bean.EmployeeList
<bean id="employees" class=
"org.springframework.web.servlet.view.xml.MarshallingView">
<bean id="viewResolver" class=
"org.springframework.web.servlet.view.BeanNameViewResolver" />
上面的代码中:
Component-scan启用对带有Spring注释的类进行自动扫描,在实践中,它将检查控制器类中所定义的@Controller注释。
和使用@ReqeustMapping注释的类或函数的beans由Spring处理这个注释将在下一节进行详细介绍。
Jaxb2Mashaller定义使用JAXB 2进行对象XML映射(OXM)的编组器(marshaller)和解组器(unmarshaller )
MashallingView定义一个使用Jaxb2Mashaller的XML表示view
BeanNameViewResolver使用用户指定的bean名称定义一个视图解析器
本例将使用名为“employees”的MarshallingView。
这样就完成了Spring的相关配置。下一步是编写一个控制器来处理用户请求。清单3显示的是控制器类。
B. java微服务开发,为什么只依赖了接口就能拿到实例
因为微服务之间要调用彼此的接口。
SpringCloud中服务之间的两种调用RESTful接口通信的方式:RestTemplateFeignRestTemplate是一个Http客户端,类似于HTTPClient,org但比HTTPClient更简单。这种限制接口调用次数的方式,我们通常称之为限流。
一个微服务的服务注册中心,nacos关闭后服务的链接不会失效。
C. 如何在Java客户端调用RESTful服务
public static void main(String[] args) { Store store = new Store();// 准备参数 // 首先创建一个webservice客户端,参数依次为:webservice的url, webservice的名称, webservice的方法, 参数列表, 返回类型, 泛型的类型(不需要泛型就传入null) WebserviceClient client = new WebserviceClient(", "store", "find", new Object[] { store }, List.class, Store.class); List<Store> list = client.execute();// 调用webservice System.out.println("从服务器返回" + list.size() + "个商品");// 得到了服务端返回的数据 }
D. 如何使用RestTemplate访问restful服务
一. 什么是RestTemplate
传统情况下在Java代码里访问restful服务,一般使用Apache的HttpClient。不过此种方法使用起来太过繁琐。spring提供了一种简单便捷的模板类来进行操作,这就是RestTemplate。
二、举个例子。 //请求地址
String url = "http://localhost:8080/testPost";
//入参
RequestBean requestBean = new RequestBean();
requestBean.setTest1("1");
requestBean.setTest2("2");
requestBean.setTest3("3");
RestTemplate restTemplate = new RestTemplate();
ResponseBean responseBean = restTemplate.postForObject(url, requestBean, ResponseBean.class);
从这个例子可以看出,使用restTemplate访问restful接口非常的简单粗暴无脑。(url,
requestMap, ResponseBean.class)这三个参数分别代表 请求地址、请求参数、HTTP响应转换被转换成的对象类型。
RestTemplate方法的名称遵循命名约定,第一部分指出正在调用什么HTTP方法,第二部分指示返回的内容。本例中调用了restTemplate.postForObject方法,post指调用了HTTP的post方法,Object指将HTTP响应转换为您选择的对象类型。
三.手动指定转换器(HttpMessageConverter)
我们知道,调用reseful接口传递的数据内容是json格式的字符串,返回的响应也是json格式的字符串。然而restTemplate.postForObject方法的请求参数RequestBean和返回参数ResponseBean却都是java类。是RestTemplate通过HttpMessageConverter自动帮我们做了转换的操作。
默认情况下RestTemplate自动帮我们注册了一组HttpMessageConverter用来处理一些不同的contentType的请求。
如StringHttpMessageConverter来处理text/plain;来处理application/json;来处理application/xml。
你可以在org.springframework.http.converter包下找到所有spring帮我们实现好的转换器。
如果现有的转换器不能满足你的需求,你还可以实现org.springframework.http.converter.HttpMessageConverter接口自己写一个。
四.设置底层连接方式
要创建一个RestTemplate的实例,您可以简单地调用默认的无参数构造函数。这将使用java.NET包中的标准Java类作为底层实现来创建HTTP请求。
但很多时候我们需要像传统的HttpClient那样设置HTTP请求的一些属性。RestTemplate使用了一种很偷懒的方式实现了这个需求,那就是直接使用一个HttpClient作为底层实现......
五.设置拦截器(ClientHttpRequestInterceptor)
有时候我们需要对请求做一些通用的拦截设置,这就可以使用拦截器进行处理。拦截器需要我们实现org.springframework.http.client.ClientHttpRequestInterceptor接口自己写。
以上是如何使用RestTemplate方便快捷的访问restful接口。其实RestTemplate的功能非常强大
E. java做的restful通过(API key或者token)认证方式的代码是怎样的最好能提供例子,坐等高手回答,急急急!
你提供一个n位的字符串,让客户调用的时候传递过去,让人的服务器验证是否你提供的。——当然这个字串是有算法的,不是随便写的。
F. python与Java如何构建通信请给出一个学习方向。
1、python提供restful接口,java直接调用restful api即可;
2、rpc通信,现成框架例如grpc。 java 和python都支持。
3、消息队列,python计算结果存到消息队列,java端订阅处理即可。相当于引入一个中间代理角色。
思路大概就上面的方式,根据实际场景进行技术选型。
G. java使用restful格式有什么好处
好处:
1.REST规范:强调HTTP应当以资源为中心,并且规范了资源URI的风格;
2.规范了HTTP请求动作(PUT,POST等)的使用,具有对应的语义;
3.遵循REST规范的Web应用将会获得下面好处:
a.URL具有很强可读性的,具有自描述性;
b.资源描述与视图的松耦合;
c.可提供OpenAPI,便于第三方系统集成,提高互操作性;
d.如果提供无状态的服务接口,可提高应用的水平扩展性;
H. java 可以调用 wcf restful 吗
当 HTTP GET 请求
~~~~~~~
I. java后台接口怎么方便返回restful数据
首先Map的形式是最不推荐的。前端需要的数据必定是灵活多变的,我们可以创建多个VO,DTO来满足不同的接口调用。
比如用户User中包含密码,而返回前端的数据不能包含密码等敏感字段,我们可以创建UserVO,返回不带密码的数据。你可以通过“领域驱动”进一步了解相关VO,DTO,PO等的区别和使用。
你可能会说,为表现层专门创建VO较为繁琐,bean之间的转换成了问题。
这里推荐使用mapstruct。mapstruct使用注解驱动完成转换代码的生成,你只需要提供Mapper接口即可。
比如User 和 UserVO 的转换:
@Mapper(componentModel = "spring", uses = {})
public interface UserMapper {
UserVO userToUserVO(User user);
}
J. 如何 调用 restful web services
RESTful WebService是比基于SOAP消息的WebService简单的多的一种轻量级Web服务,RESTful WebService是没有状态的,发布和调用都非常的轻松容易。
下面写一个最简单的Hello World例子,以便对RESTful WebService有个感性认识。因为非常专业理论化的描述RESTful WebService是一件理解起来很痛苦的事情。看看例子就知道个大概了,再看理论就容易理解多了。
/**
* RESTful WebService入门
* @author leimin 2009-11-18 16:42:43
*/
packageexample;
importcom.sun.jersey.api.container.httpserver.HttpServerFactory;
importcom.sun.net.httpserver.HttpServer;
importjavax.ws.rs.GET;
importjavax.ws.rs.Path;
importjavax.ws.rs.Proces;
importjava.io.IOException;
//指定URI
@Path("/helloworld")
publicclassHelloWorld {
//处理HTTP的GET请求
@GET
// 处理请求反馈的内容格式为"text/plain"
@Proces("text/plain")
publicString getClichedMessage() {
return"Hello World!";
}
publicstaticvoidmain(String[] args)throwsIOException {
//创建RESTful WebService服务
HttpServer server = HttpServerFactory.create("http://192.168.14.117:9999/");
//启动服务,这会导致新开一个线程
server.start();
//输出服务的一些提示信息到控制台
System.out.println("RESTful WebService服务已经启动");
System.out.println("服务访问地址: http://192.168.14.117:9999/helloworld");
}
}
运行这个类,控制台输入出:
2009-11-18 17:25:37 com.sun.jersey.api.core.ClasspathResourceConfig init
信息: Scanningforroot resource and provider classes in the paths:
D:jdk16jrelibalt-rt.jar
D:jdk16jrelibcharsets.jar
D:jdk16jrelibdeploy.jar
D:jdk16jrelibjavaws.jar
D:jdk16jrelibjce.jar
D:jdk16jrelibjsse.jar
D:jdk16jrelibmanagement-agent.jar
D:jdk16jrelibplugin.jar
D:jdk16jrelib
esources.jar
D:jdk16jrelib
t.jar
D:jdk16jrelibextdnsns.jar
D:jdk16jrelibextlocaledata.jar
D:jdk16jrelibextsunjce_provider.jar
D:jdk16jrelibextsunmscapi.jar
D:jdk16jrelibextsunpkcs11.jar
D:
etwideo
estwsoutproction
estws
D:IDEA8libjavaee.jar
D:
etwideo
estwslibmail-1.4.jar
D:
etwideo
estwslibasm-3.1.jar
D:
etwideo
estwslibwadl2java.jar
D:
etwideo
estwslibjettison-1.0.1.jar
D:
etwideo
estwslibgrizzly-servlet-webserver-1.8.6.4.jar
D:
etwideo
estwslibwadl-core.jar
D:
etwideo
estwsliblocalizer.jar
D:
etwideo
estwslibjdom-1.0.jar
D:
etwideo
estwslibjsr311-api-1.0.jar
D:
etwideo
estwslibstax-api-1.0-2.jar
D:
etwideo
estwslibpersistence-api-1.0.2.jar
D:
etwideo
estwslibjaxb-api-2.1.jar
D:
etwideo
estwslibwadl-cmdline.jar
D:
etwideo
estwslibhttp-20070405.jar
D:
etwideo
estwslib
ome-0.9.jar
D:
etwideo
estwslibactivation-1.1.jar
D:
etwideo
estwslibjaxb-impl-2.1.10.jar
D:
etwideo
estwslibjersey-bundle-1.0.3.jar
D:
etwideo
estwslibjackson-lgpl-0.9.4.jar
D:
etwideo
estwslibFastInfoset-1.2.2.jar
D:
etwideo
estwslibjaxb-xjc.jar
D:IDEA8libidea_rt.jar
2009-11-18 17:25:46 com.sun.jersey.api.core.ClasspathResourceConfig init
信息: Root resource classes found:
classexample.HelloWorld
2009-11-18 17:25:46 com.sun.jersey.api.core.ClasspathResourceConfig init
信息: Provider classes found:
RESTful WebService服务已经启动
服务访问地址:http://192.168.14.117:9999/helloworld
可见,服务启动成功了,下来就是从浏览器中访问服务了,输入http://192.168.14.117:9999/helloworld,将发送一个HTTP GET请求,看看结果:
测试成功了!