我正在做一个REST应用程序。我已经使GET
方法没有问题,但是,当我实施POST
方法时,它表示我没有为其实现OPTIONS
方法。我正在为URI执行OPTIONS
方法:
http://192.168.1.26:8080/sellAppWeb/api/object/
我有POST
和OPTIONS
方法:
@OPTIONS
@Produces("application/json; charset=UTF-8")
public Response options() {
return Response.ok().build();
}
@Override
@POST
public Response save(CervejaDTO cervejaDTO) {
cervejaController.register(cervejaDTO);
return Response.ok(cervejaDTO).build();
}
然后我制作了DELETE
方法,并再次说明我没有OPTIONS
方法。然后我需要创建另一个OPTIONS
方法,它在URI结尾有一个ID
。例如,删除具有id = 3
的对象:
http://192.168.1.26:8080/sellAppWeb/api/object/3
我需要另一个OPTIONS
具有DELETE
URI的相同结构:
@OPTIONS
@Path("/{id}")
@Produces("application/json; charset=UTF-8")
public Response optionsDelete(@PathParam("id") Integer id) {
return Response.ok().build();
}
@Override
@POST
public Response save(CervejaDTO cervejaDTO) {
cervejaController.register(cervejaDTO);
return Response.ok(cervejaDTO).build();
}
是否有人可以为所有REST请求执行通用OPTIONS
?
web.xml:
<display-name>Testes de serviços REST</display-name>
<description>Testes de serviços REST</description>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/api</param-value>
</context-param>
<context-param>
<param-name>resteasy.providers</param-name>
<param-value>br.com.sell.app.exception.handler.DefaultExceptionHandler</param-value>
</context-param>
<listener>
<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
答案 0 :(得分:3)
在这种情况下,您不需要实现OPTIONS
HTTP VERB。由于您正在使用RESTEasy,这是Wildfly使用的JAX-RS实现,我遇到的问题是由于web.xml
上的servlet映射。
当我在Eclipse上添加JAX-RS facet并告诉它更新web.xml
时,我遇到了这个问题。包含Restful应用程序映射的默认生成web.xml
不会将您的应用程序正确映射到RESTful资源路径。
如果您尚未创建自己的自定义Application
,这就是web.xml的外观。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>My REST API</display-name>
<description>My REST API</description>
<servlet>
<description>JAX-RS Tools Generated - Do not modify</description>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/jaxrs/*</url-pattern>
</servlet-mapping>
</web-app>
确保您的<servlet-name>
和<servlet-mapping>
已映射,如上例所示。如果您延长了Application
课程,只需在web.xml
而不是默认Application
中指定,如上所示。
此外,您的@POST
资源方法建议您使用@Consumes
注释指定RESTful数据的资源类型(在您的情况下,您的DTO)。
例如
@POST
@Path("/save")
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response save(CervejaDTO cervejaDTO)
}
答案 1 :(得分:3)
然而,当我实现POST方法时,它表示我没有为它实现OPTIONS方法。&#34;&#34;当我发出POST或DELTE请求时,应用程序会在&#34;
之前自动生成OPTIONS请求
这听起来像是CORS(跨源资源共享)问题。您可以在HTTP access control (CORS)了解更多相关信息。基本上OPTIONS请求是在实际请求之前的预检请求。对于某些类型的AJAX请求,会发生这种情况。
为此,RESTeasy拥有您可以注册的CorsFilter
。您需要将过滤器配置为您要允许的设置。另请参阅示例here以了解配置它的一种方法。
答案 2 :(得分:2)
我尝试了RestEasy's CorsFilter,但是使用OPTIONS方法进行的调用正在返回
RESTEASY003655:找不到选项的资源方法,返回OK 允许标题
我写了一个简单的过滤器:
这是代码。这是一个简化版本,ditry - 但效率很高。如果您只想在查询“真实”端点时发回200,请随意优化过滤器。
@Provider
public class CorsFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
MultivaluedMap<String, Object> headers = responseContext.getHeaders();
headers.add("Access-Control-Allow-Origin", "*"); // If you want to be more restrictive it could be localhost:4200
headers.add("Access-Control-Allow-Methods", "GET, PUT, POST, OPTIONS"); // You can add HEAD, DELETE, TRACE, PATCH
headers.add("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept, Accept-Language"); // etc
if (requestContext.getMethod().equals("OPTIONS"))
responseContext.setStatus(200);
}}
答案 3 :(得分:1)
我建议您使用Spring Controllers和RequestMapping注释,它们非常易于使用:
@RequestMapping(value="/method0", method="POST")
@ResponseBody
public String method0(){
return "method0";
}
您不需要实现OPTIONS方法,只需声明您的方法并使用注释将其定义为POST / GET / PUT / DELETE请求方法。 Here有很多例子。
答案 4 :(得分:1)
对我而言,这是唯一的工作方式。
在java restclient项目中创建类。
sum = 0
i = 10
while i <30:
j=i
while j < (10*i):
sum += j
j+=1
i+=1
答案 5 :(得分:0)
您可以使用@Path(“ {path:。*}”)。
@OPTIONS
@Path("{path:.*}")
public Response handleCORSRequest() throws Exception {
Response.ResponseBuilder builder = Response.ok();
return builder.build();
}