Spring 休息服务 returns 基于逻辑的不同媒体类型
Spring Rest Service that returns different media type based on logic
求助!我已尽我所能,但似乎没有任何效果。我的问题如下:
我有一个 Spring REST 服务,它进行 REST 调用,接收 base64 编码的 PDF。然后我解码 PDF,并将其显示在浏览器中。我可以让这部分完美地工作!但!我在处理 404、500 等时遇到问题。错误信息。
不幸的是,错误消息在 API 中作为哈希图中的消息返回给我,正如您在下面我的逻辑中看到的那样。
我试过创建 PDF,但我无法将其转换为文件 Object,我试过将字节直接流式传输到浏览器,但无论我做什么,它都不适合我。
有没有办法根据逻辑更改响应 Headers?成功时,return一个pdf,错误时return一个文本文件到浏览器?
我在这里完全筋疲力尽,不知道该去哪里。任何建议或指示将不胜感激。
我也试过向浏览器抛出一个 404,但它期待一个 pdf 文件,我收到 MIME 错误。
@Controller
@Path("/mon")
public class WSController {
@Autowired
Service service;
@GET
@Produces("application/pdf")
@Path("/ws")
public File getWs(@QueryParam("vin") String vin) throws IOException, URISyntaxException {
Map response = service.getWs(vin);
if (response == null) {
return createErrorFile("Server Error, please try again later.");
} else if (response.get("ErrorCode") != null && response.get("ErrorCode").equals("E")) {
return createErrorFile((String) response.get("ErrorDescription"));
} else {
return decodeBase64(((String) response.get("Base64String")).replace("\n",""));
}
}
private File decodeBase64(String encodedFile) throws IOException {
byte[] decodedBytes = DatatypeConverter.parseBase64Binary(encodedFile);
File file = new File("wS.pdf");
FileOutputStream fop = new FileOutputStream(file);
fop.write(decodedBytes);
fop.flush();
fop.close();
return file;
}
private File createErrorFile(String errorDescription) throws IOException {
//Not sure what to do here
return null;
}
编辑:这是最终对我有用的东西。非常感谢你的建议。这是一次美妙的学习经历。
@GET
@Path("/ws")
public Response getWS(@QueryParam("vin") String vin) throws IOException, URISyntaxException {
Map results = Service.getWS(vin);
if (results == null) {
Response.ResponseBuilder rBuild = Response.status(Response.Status.BAD_REQUEST);
return rBuild.type(MediaType.TEXT_PLAIN)
.entity("Server error, please try again later.")
.build();
} else if (results.get("ErrorCode") != null && results.get("ErrorCode").equals("E")) {
Response.ResponseBuilder rBuild = Response.status(Response.Status.BAD_REQUEST);
return rBuild.type(MediaType.TEXT_PLAIN)
.entity(results.get("ErrorDescription"))
.build();
} else {
File responseData = decodeBase64(((String) results.get("Base64String")).replace("\n", ""));
Response.ResponseBuilder rBuild = Response.ok(responseData, "application/pdf");
return rBuild.build();
}
}
不要恐慌 :-) 您可以通过向 spring 请求 HttpServletResponse 对象来实现对响应的完全控制。您可以设置响应的 MIME 类型或设置错误代码:
@GET
@Produces("application/pdf")
@Path("/ws")
public void getWs(@QueryParam("vin") String vin, HttpServletRequest request) {
...
...
request.setContentType("text/html");
...
我看到你在 post 中提到的一些问题,但我只读了这些实际问题
Is there a way to change the Response Headers based on Logic? When successful, return a pdf, and when error return a text file to the browser?
所以我会解决这些问题。我自己,我更喜欢总是return一个Response
。您可以在那里设置所有 headers 以及更多内容。例如
@GET
public Response getSomething() {
...
Response.ResponseBuilder builder = Response.status(200);
Response response = builder.entity(file)
.header("Content-Type", "someType")
.build();
return response;
}
entity(...)
是您通常 return 作为实体 body。
- 另请参阅
Response.ResponseBuilder
的 API。 Response
return 和 Response.ResponseBuilder
中的大多数静态方法,因此有很多选项可以构建请求。
就您的方法中未处理的异常而言,您可以纠正 ExceptionMapper(s)
to handle different exceptions. See here。您可以从映射器 return Response
。
您可以编写自定义 WebApplicationException
(s),以免因异常响应构建而使您的代码混乱。并抛出该异常。 JAX-RS 已经内置了处理异常的机制。您可以使用内置 Response
创建异常。 link 有一个例外。处理异常有很多不同的选项。
求助!我已尽我所能,但似乎没有任何效果。我的问题如下:
我有一个 Spring REST 服务,它进行 REST 调用,接收 base64 编码的 PDF。然后我解码 PDF,并将其显示在浏览器中。我可以让这部分完美地工作!但!我在处理 404、500 等时遇到问题。错误信息。
不幸的是,错误消息在 API 中作为哈希图中的消息返回给我,正如您在下面我的逻辑中看到的那样。
我试过创建 PDF,但我无法将其转换为文件 Object,我试过将字节直接流式传输到浏览器,但无论我做什么,它都不适合我。
有没有办法根据逻辑更改响应 Headers?成功时,return一个pdf,错误时return一个文本文件到浏览器?
我在这里完全筋疲力尽,不知道该去哪里。任何建议或指示将不胜感激。
我也试过向浏览器抛出一个 404,但它期待一个 pdf 文件,我收到 MIME 错误。
@Controller
@Path("/mon")
public class WSController {
@Autowired
Service service;
@GET
@Produces("application/pdf")
@Path("/ws")
public File getWs(@QueryParam("vin") String vin) throws IOException, URISyntaxException {
Map response = service.getWs(vin);
if (response == null) {
return createErrorFile("Server Error, please try again later.");
} else if (response.get("ErrorCode") != null && response.get("ErrorCode").equals("E")) {
return createErrorFile((String) response.get("ErrorDescription"));
} else {
return decodeBase64(((String) response.get("Base64String")).replace("\n",""));
}
}
private File decodeBase64(String encodedFile) throws IOException {
byte[] decodedBytes = DatatypeConverter.parseBase64Binary(encodedFile);
File file = new File("wS.pdf");
FileOutputStream fop = new FileOutputStream(file);
fop.write(decodedBytes);
fop.flush();
fop.close();
return file;
}
private File createErrorFile(String errorDescription) throws IOException {
//Not sure what to do here
return null;
}
编辑:这是最终对我有用的东西。非常感谢你的建议。这是一次美妙的学习经历。
@GET
@Path("/ws")
public Response getWS(@QueryParam("vin") String vin) throws IOException, URISyntaxException {
Map results = Service.getWS(vin);
if (results == null) {
Response.ResponseBuilder rBuild = Response.status(Response.Status.BAD_REQUEST);
return rBuild.type(MediaType.TEXT_PLAIN)
.entity("Server error, please try again later.")
.build();
} else if (results.get("ErrorCode") != null && results.get("ErrorCode").equals("E")) {
Response.ResponseBuilder rBuild = Response.status(Response.Status.BAD_REQUEST);
return rBuild.type(MediaType.TEXT_PLAIN)
.entity(results.get("ErrorDescription"))
.build();
} else {
File responseData = decodeBase64(((String) results.get("Base64String")).replace("\n", ""));
Response.ResponseBuilder rBuild = Response.ok(responseData, "application/pdf");
return rBuild.build();
}
}
不要恐慌 :-) 您可以通过向 spring 请求 HttpServletResponse 对象来实现对响应的完全控制。您可以设置响应的 MIME 类型或设置错误代码:
@GET
@Produces("application/pdf")
@Path("/ws")
public void getWs(@QueryParam("vin") String vin, HttpServletRequest request) {
...
...
request.setContentType("text/html");
...
我看到你在 post 中提到的一些问题,但我只读了这些实际问题
Is there a way to change the Response Headers based on Logic? When successful, return a pdf, and when error return a text file to the browser?
所以我会解决这些问题。我自己,我更喜欢总是return一个Response
。您可以在那里设置所有 headers 以及更多内容。例如
@GET
public Response getSomething() {
...
Response.ResponseBuilder builder = Response.status(200);
Response response = builder.entity(file)
.header("Content-Type", "someType")
.build();
return response;
}
entity(...)
是您通常 return 作为实体 body。
- 另请参阅
Response.ResponseBuilder
的 API。Response
return 和Response.ResponseBuilder
中的大多数静态方法,因此有很多选项可以构建请求。
就您的方法中未处理的异常而言,您可以纠正 ExceptionMapper(s)
to handle different exceptions. See here。您可以从映射器 return Response
。
您可以编写自定义 WebApplicationException
(s),以免因异常响应构建而使您的代码混乱。并抛出该异常。 JAX-RS 已经内置了处理异常的机制。您可以使用内置 Response
创建异常。 link 有一个例外。处理异常有很多不同的选项。