我正在 JAX-RS 2.0、JDK 8 中编写 REST API 以满足以下要求
POST API /server/fileUpload/(多部分表单数据),我需要在此发送一个大.AI(Adobe Illustrator)文件。
服务器获取文件并返回状态 202(已接受),确认文件传输成功。(从端点到服务器)
现在在服务器上,我使用 Java + Imagemagik 将 .AI 文件(20-25 MB 文件)转换为小 JPG 缩略图,放置在 Apache HTTP 服务器上并共享位置(例如http://happyplace/thumbnail0987.jpg)
现在,第二个响应应来自服务器,状态为 200 OK 且缩略图 URL
使用一个 REST API 可行吗?(异步/类似)
或者我应该将其拆分为 2 个 API 调用,请提出建议
我目前正在运行我自己的网络应用程序,它通常不会给我设置环境带来任何问题。然而,这是一台安装了 Tomcat 9.0 和 JDK 8 的新机器。这台机器与其他正常工作的机器之间的唯一区别是 Eclipse IDE 的版本。
在此环境中,所有资源都会返回 404,我已将运行时的原因缩小为:
javax.servlet.ServletException:当 allowedOrigins=[*] 时,不允许配置supportsCredentials=[true]
有人知道为什么不再允许这样做/为什么它不起作用?
在 src/main/webapp/WEB-INF/web.xml 中添加 CORS 过滤器,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!-- This web.xml file is not required when using Servlet 3.0 container,
see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html -->
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>lksecure.lks,lksecure,messenger.msg</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/webapi`/`*</url-pattern>
</servlet-mapping>
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET,POST,DELETE,HEAD,OPTIONS</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>Content-Type,auth,user,persona,target,recaptcha,id,endpoint,portX-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
</init-param>
<init-param> …Run Code Online (Sandbox Code Playgroud) 我正在研究 Jersey,我在一本书中看到您可以使用 CompletableFuture (和 CompletitionStage)以非阻塞 IO 方式调用您的 API。
但是当我用Postman调用API时,我总是得到500。
如果我调试代码,我会发现这些方法被正确调用。
第一个 GET 方法是同步的并且可以正确工作。第二次和第三次返回错误500。
我缺少什么?
@Path("/hello")
public class HelloController {
@GET
@Path("/first")
@Produces(MediaType.TEXT_PLAIN)
public String first() {
return "It works";
}
@GET
@Path("/second")
@Produces(MediaType.TEXT_PLAIN)
public CompletionStage<Response> second() {
return CompletableFuture.supplyAsync(() -> Response.accepted().entity("Hello!").build());
}
@GET
@Path("/third")
@Produces(MediaType.TEXT_PLAIN)
public CompletableFuture<Response> third() {
return CompletableFuture.supplyAsync(() -> Response.accepted().entity("Hello!").build());
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 json 正文的示例来记录 api 错误响应。我找不到示例或合适的注释。使用 swagger 编辑器,我至少可以获得一些看起来像我想要实现的结果的东西。
responses:
'200' :
description: Request completed with no errors
examples:
application/json: {"result" : { "id": "blue" }}
Run Code Online (Sandbox Code Playgroud)
库是 swagger-core 1.6.0
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-core</artifactId>
<scope>compile</scope>
<version>1.6.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
端点是使用 jax-rs 创建的。
我对端点做了这个
@ApiResponses(value = {
@ApiResponse(code = 200, message = "OK",
examples = @Example(value = @ExampleProperty(mediaType = "application/json", value = "{\"result\" : { \"id\": \"blue\" }}"))
)
})
public Response getResult(){}
Run Code Online (Sandbox Code Playgroud)
生成的 swagger.json 没有所需的
examples:
application/json: {"result" : { "id": "blue" }}
Run Code Online (Sandbox Code Playgroud)
我也尝试传递response = ApiResponse.class、Examples.class和Example.class,但它没有改变。 …
我的问题有两个:
我正在寻找一种在 quarkus 应用程序服务器上实现分段文件上传的方法,该服务器允许程序员访问上传的文件。浏览文档似乎有https://quarkus.io/guides/rest-client-multipart,但这并没有告诉我文件存储在服务器上的位置(如果有的话)。
我也想知道幕后发生了什么。对于大文件(>100MB),内存占用会是什么样子?
我的问题可能很容易解决,但目前我不明白。在我的 Quarkus-App 中,我有一个 REST-Endpoint,它应该调用一个方法,不等待结果并立即返回 202-HTTP-Statuscode。
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response calculateAsync(String input) {
process();
return Response.accepted().build();
}
Run Code Online (Sandbox Code Playgroud)
我已阅读有关 Vert.x 和异步处理的 Quarkus 文档。但要点是:处理是异步完成的,但客户端等待结果。我的客户不需要等待,因为没有返回值。这类似于批处理的调用。
所以我需要类似 a 的东西new Thread,但具有所有 Quarkus-Context。
我们有一个 SpringBoot 应用程序,并使用 Jersey 来审核传入的 HTTP 请求。
我们实现了 Jersey ContainerRequestFilter来检索传入的HttpServletRequest 并使用 HttpServletRequest 的getParameterMap()方法来提取查询和表单数据并将其放入我们的审核中。
这与 getParameterMap() 的 javadoc 一致:
“请求参数是随请求发送的额外信息。对于 HTTP servlet,参数包含在查询字符串或发布的表单数据中。”
这是与过滤器相关的文档:
更新SpringBoot后,我们发现getParameterMap()不再返回表单数据,但仍然返回查询数据。
我们发现 SpringBoot 2.1 是支持我们代码的最后一个版本。在 SpringBoot 2.2 中,Jersey 的版本更新为 2.29,但在查看发行说明后,我们没有看到任何与此相关的内容。
发生了什么变化?我们需要改变什么来支持 SpringBoot 2.2 / Jersey 2.29?
这是我们代码的简化版本:
JerseyRequestFilter - 我们的过滤器
import javax.annotation.Priority;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Priorities;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.ResourceInfo;
import javax.ws.rs.core.Context;
import javax.ws.rs.ext.Provider;
...
@Provider
@Priority(Priorities.AUTHORIZATION)
public class JerseyRequestFilter implements ContainerRequestFilter {
@Context
private ResourceInfo resourceInfo;
@Context
private …Run Code Online (Sandbox Code Playgroud) 鉴于项目sizeRange模型领域的OpenAPI 规范:
size:
type: string
description: Size range for this project
enum: [RANGE_0_10M,RANGE_10M_50M,RANGE_50M_100M]
example: RANGE_10M_50M
Run Code Online (Sandbox Code Playgroud)
OpenAPIjaxrs-spec生成器生成一个Project.class,如下所示:
public enum SizeEnum {
_0_10M(String.valueOf("RANGE_0_10M")), _10M_50M(String.valueOf("RANGE_10M_50M")), _50M_100M(String.valueOf("RANGE_50M_100M"));
Run Code Online (Sandbox Code Playgroud)
生成的枚举值被缩短(用于 Java):
Project.SizeEnum._0_10M
Run Code Online (Sandbox Code Playgroud)
我准备忽略这种不便,但在这种情况下会导致异常:
Enum.valueOf(Project.SizeEnum.class, "RANGE_0_10M");
No enum constant com.mycompany.my_project.Project.SizeEnum.RANGE_0_10M
Run Code Online (Sandbox Code Playgroud)
如果我将一个以除此之外的内容开头的值添加到枚举中,RANGE_则会导致所有枚举值正确显示。我推断某些进程会自动缩短所有进程,因为它们共享一个前缀。
这是我可以访问的 OpenAPI 生成器配置吗?我找不到它:
我正在编写 JAX-RS API。
当尝试运行以下单元测试时:
@Test
public void verifyUserTest() throws InvalidTokenException, InvalidUserException {
Mockito.when(service.verifyLogin(Mockito.any(LoginRequestDTO.class))).thenReturn(true);
Mockito.when(service.createToken(Mockito.any(String.class))).thenReturn("testToken");
var res = sut.verifyUser(new LoginRequestDTO("testuser", "testpass"));
var entity = res.getEntity();
System.out.println(entity);
// Assertions.assertEquals("testuser", res.getUsername());
// Assertions.assertEquals("testToken", res.getToken());
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
java.lang.LinkageError: ClassCastException: attempting to castjar:file:/C:/Users/User/.m2/repository/javax/javaee-web-api/8.0.1/javaee-web-api-8.0.1.jar!/javax/ws/rs/ext/RuntimeDelegate.class to jar:file:/C:/Users/User/.m2/repository/javax/javaee-web-api/8.0.1/javaee-web-api-8.0.1.jar!/javax/ws/rs/ext/RuntimeDelegate.class
(对我来说)这看起来就像同一个类被加载了两次。我该如何解决这个问题?谢谢。
我需要从 Jersey 资源传输响应,但我不希望 http 响应使用Transfer-Encoding: chunked. 我提前知道流的长度,因此不需要分块编码。
@GET
@Path("/contentLength")
public Response contentLength() {
return Response.ok()
.header("Content-Length", 10_000)
.entity(RandomInputStream.generateBytes(10_000))
.build());
}
Run Code Online (Sandbox Code Playgroud)
即使我设置了 Content-Length,测试也显示响应使用分块传输编码
@Test
void contentLength() throws Exception {
Response response = target().path("/contentLength").request().get();
assertThat(response.getHeaderString("Transfer-Encoding"), Matchers.nullValue());
assertThat(response.getHeaderString("Content-Length"), is("10000"));
}
Run Code Online (Sandbox Code Playgroud)
Expected: null
but: was "chunked"
Run Code Online (Sandbox Code Playgroud)
有类似的问题,但答案是错误的或需要缓冲响应,这对于大型响应来说是不可行的。对于大型响应,http 不需要分块编码,仅当响应启动时总长度未知时才需要分块编码。
jax-rs ×10
java ×5
jersey ×4
asynchronous ×2
jersey-2.0 ×2
quarkus ×2
cors ×1
enums ×1
imagemagick ×1
junit ×1
openapi ×1
rest ×1
spring-boot ×1
swagger ×1
swagger-2.0 ×1
tomcat ×1