您好我已经使用JAX-WS进行基于SOAP的Web服务.现在我想使用REST,因为REST比我从这里研究的那样优于SOAP .
但是从不同的文章我知道我们也可以从JAX-WS创建RESTful Web服务.但大多数人都说我们应该使用JAX-RS而不是JAX-WS.
我的问题是JAX-WS RESTful webservice和JAX-RS(jersey)之间有什么区别.JAX-RS优于JAX-WS有什么优势?为什么我们应该将JAX-RS用于RESTful Web服务?
提前致谢.
我尝试从JavaScript客户端上传文件到JAX-RS Java服务器.
我在我的服务器上使用以下REST上传功能:
@POST
@Produces('application/json')
UploadDto upload(
@Context HttpServletRequest request,
@QueryParam("cookie") String cookie) {
def contentType
byte [] fileBytes
log.debug "upload - cookie: "+cookie
try{
if (request instanceof MultipartHttpServletRequest) {
log.debug "request instanceof MultipartHttpServletRequest"
MultipartHttpServletRequest myrequest = request
CommonsMultipartFile file = (CommonsMultipartFile) myrequest.getFile('file')
fileBytes = file.bytes
contentType = file.contentType
log.debug ">>>>> upload size of the file in byte: "+ file.size
}
else if (request instanceof SecurityContextHolderAwareRequestWrapper) {
log.debug "request instanceof SecurityContextHolderAwareRequestWrapper"
SecurityContextHolderAwareRequestWrapper myrequest = request
//get uploaded file's inputStream
InputStream …Run Code Online (Sandbox Code Playgroud) 我是RESTful API的noobie,我正在尝试构建一个Login服务,我在其中提供了一个电子邮件和密码,如果验证成功,则存储一个cookie.另外,我如何检查cookie(如果存储)?
怎么能实现这一目标?
@Path("/login")
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes({MediaType.APPLICATION_FORM_URLENCODED, MediaType.APPLICATION_JSON})
public Response Login(final String i_LoginDetails) throws JSONException {
final JSONObject obj = new JSONObject(i_LoginDetails);
try {
if (isValidUser(obj.getString("email"), obj.getString("password"))) {
// Set a cookie
} else {
// return error invalid-credentials message
}
} catch (Exception e) {
e.printStackTrace();
}
return Response.ok("TEST").build();
}
Run Code Online (Sandbox Code Playgroud)
我如何检查cookie(如果设置)?
我正在尝试使用HttpServletRequest检索从已发布表单传递给jax-rs的一些参数.但是,我的请求对象始终为我的参数返回空值.我不是以正确的方式解决这个问题吗?我已经发布了下面的代码,以及一个发送的示例请求.
这是我的服务:
@Path("/")
@Stateless
public class HomeController {
@Context
private HttpServletRequest request;
@Context
private HttpServletResponse response;
@EJB
private LoginServiceLocal loginService;
@POST
@Path("/authenticate")
@Consumes("application/x-www-form-urlencoded")
public void authenticate() throws Exception {
String email = request.getParameter("email");
String password = request.getParameter("password");
if (loginService.authenticate(email, password)) {
response.sendRedirect("/app");
} else {
request.setAttribute("authenticationError", "Invalid email/password.");
}
}
}
Run Code Online (Sandbox Code Playgroud)
示例请求:
POST http://localhost:8081/cheetah-web/authenticate HTTP/1.1
Host: localhost:8081
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive …Run Code Online (Sandbox Code Playgroud) 我正在编写一个JAX-RS(Jersey + Maven)应用程序来执行一些棘手的操作(例如调用WAR中嵌入的本机可执行文件).我需要在服务器上运行[部分]单元测试(JUnit4)(运行Tomcat 7.0.22的Amazon Elastic Beanstalk)来检查一切是否正常.
除了RYO(滚动你自己的)之外,还有一种标准的,灵活的方式吗?我发现的东西似乎更多地与开发人员机器上的集成测试(即Jersey测试框架)有关.甚至RYO让我感到困惑......我怎样才能从源包中调用测试包中的代码?
基本上,我想创建一个我可以调用的/ test资源,它将以漂亮的格式从服务器返回我的单元测试结果.如果我可以做/ test/{category}更好
我正在尝试使用RESTEasy作为JAX-RS 2.0客户端实现.问题是我遇到了运行时异常:
06-28 13:29:06.410: E/AndroidRuntime(5745): Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: org.glassfish.jersey.client.JerseyClientBuilder
06-28 13:29:06.410: E/AndroidRuntime(5745): at javax.ws.rs.client.ClientBuilder.newBuilder(ClientBuilder.java:103)
Run Code Online (Sandbox Code Playgroud)
所以该newBuilder()方法正在搜索JerseyClientBuilder我是否理解它是正确的.如何告诉系统使用RESTEasy?
在我目前的公司中,我们正在开始一个新项目,该项目将是Java中的REST API,部署在像Tomcat这样的servlet容器中.在我之前使用REST框架(如JAX-RS和Jersey,JBOSS REST Easy,Spring MVC)的经验中,我知道使用类似于直接编写Servlet来处理请求的框架的一些优点.
(当然我们知道所提到的框架仍然使用Servlets)
我发现很难说服他们.因为他们建议编写servlet,认为它对性能更好(可能是这种情况,但我认为使用其中一个框架的开销对于REST API来说应该是微不足道的).
这是我的理由:
1)更少的样板和更简洁的代码(更易于维护和测试).使用JAX-RS框架或SpringMVC,您可以通过编写带有注释的方法来非常轻松地定义REST资源,注释指示资源的PATH,要使用的http方法,查询和url参数,接受的编码等标题等.
例:
@GET
@Path("/users")
@Produces({MediaType.APPLICATION_JSON})
public UserList getUsers(@QueryParam("group") String group) {
return userService.findUsers(group);
}
Run Code Online (Sandbox Code Playgroud)
使用servlet,您至少需要这样的东西:
在web.xml中映射每个servlet的url(在Servlet 3.0中不需要):
<servlet>
<servlet-name>UsersServlet</servlet-name>
<servlet-class>test.UsersServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UsersServlet</servlet-name>
<url-pattern>/users</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
然后在servlet类中:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String group = request.getParameter("group");
response.setContentType("application/json");
PrintWriter out = response.getWriter();
JsonSerializer someJsonSerializer = new JsonSerializer();
String json = someJsonSerializer.serialize(userService.findUsers(group));
out.print(json);
}
Run Code Online (Sandbox Code Playgroud)
2)适应性.上述框架允许您轻松地向应用程序添加功能,否则您将需要手动执行,例如使用多个媒体类型输入和输出.例如,根据accept标头,使服务返回xml或json或任何其他服务.像SpringMVC和Jersey这样的框架可以很容易地为您的请求和响应配置序列化器/反序列化器.
3)REST最佳实践.通常,这些框架是基于对REST API遵循的最佳实践的充分理解而构建的,并且基于REST体系结构的标准进行定义,这使得构建可靠且标准的符合标准的应用程序变得更加容易.另一方面,Servlets为您提供了如何处理请求/响应的高度自由,以至于您很难意识到您根本不是RESTfull.
任何其他?
我试图在Websphere 8中使用Jersey 2.10,但它试图引用应用程序,它是JAX-RS 1.1的一个实现(默认Wink)我得到以下错误,即使我通过设置IBM属性禁用了JAX-RS默认值.
引起:java.lang.NoSuchMethodError:javax/ws/rs/core/Application.getProperties()Ljava/util/Map; 在Org.glassfish.jersey.server.ApplicationHandler.(ApplicationHandler.java:287)org.glassfish.jersey.servlet.WebComponent.(WebComponent.java:311)
我读了一篇帖子,说要为PARENT_LAST制作课程加载政策.在WAS控制台上禁用了更改该选项,因此我尝试使用(WAS的发布设置 - 使用服务器上的资源运行服务器)并且我的服务器崩溃了.
请指教.谢谢.
在Java EE7中,JAX-RS Client API提供了一个用于访问任何REST资源的高级API.根据文档,"客户端是管理客户端通信基础设施的重量级对象.初始化以及客户端实例的处理可能是一个相当昂贵的操作.因此建议只构建少量的客户端实例在申请中."
为了避免频繁创建客户端,我将缓存客户端实例并重用它.客户端实例线程是否安全,因为并发线程可以使用它?如果我只创建客户端实例并将其重用于所有请求,是否存在任何性能问题?
一些重载的调用请求方法,例如:get()和post(Entity<?> entity)(还有其他)SyncInvoker返回一个Response对象,而不是解组的内容.
我注意到,在get()没有文档的情况下ResponseProcessingException,而其他方法,如所有3个重载 post方法,可能会抛出一个ResponseProcessingException.
我知道这ResponseProcessingException是RuntimeException继承自的ProcessingException,但我仍然会解释这意味着该get()方法不会抛出ResponseProcessingException.
它是否正确?怎么样ClientResponseFilter?为什么比其他的呼叫请求方法(行为不同的行为put,post......)?
另外,Javadoc用于抛出的方法ResponseProcessingException说:
在接收到的HTTP响应的处理失败的情况下(例如,在过滤器中或在将响应实体数据转换为特定Java类型的实例期间).
那个部分:
或者在将响应实体数据转换为特定Java类型的实例期间
在这里似乎是错误的,因为该readEntity方法不应该被调用:
https://jersey.java.net/documentation/latest/filters-and-interceptors.html#d0e9915
这是复制和粘贴文档错误吗?
不过,我猜过滤器是一个有效的案例.