我正在使用Spring MVC.我必须编写一个服务,它将从请求体中获取输入,将数据添加到pdf并将pdf文件返回给浏览器.使用itextpdf生成pdf文档.我怎么能用Spring MVC做到这一点.我试过用这个
@RequestMapping(value="/getpdf", method=RequestMethod.POST)
public Document getPDF(HttpServletRequest request , HttpServletResponse response,
@RequestBody String json) throws Exception {
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment:filename=report.pdf");
OutputStream out = response.getOutputStream();
Document doc = PdfUtil.showHelp(emp);
return doc;
}
Run Code Online (Sandbox Code Playgroud)
showhelp生成pdf的函数.我暂时将一些随机数据放在pdf中.
public static Document showHelp(Employee emp) throws Exception {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("C:/tmp/report.pdf"));
document.open();
document.add(new Paragraph("table"));
document.add(new Paragraph(new Date().toString()));
PdfPTable table=new PdfPTable(2);
PdfPCell cell = new PdfPCell (new Paragraph ("table"));
cell.setColspan (2);
cell.setHorizontalAlignment (Element.ALIGN_CENTER);
cell.setPadding (10.0f);
cell.setBackgroundColor (new BaseColor (140, 221, 8));
table.addCell(cell);
ArrayList<String[]> …Run Code Online (Sandbox Code Playgroud) 在C#中,我有一个字符串,我正在写入响应的输出流.当我保存这个文件并在记事本++打开它,或者写字板我得到很好的格式化,他们打算换行,当我打开与普通的旧Windows记事本文件,我得到一个长的文本字符串[]方找符号,其中线休息应该是.
有没有人有这方面的经验?
谢谢
吉姆
public class CustomRequest extends JsonObjectRequest {
public CustomRequest(String url, JSONObject params,
Listener<JSONObject> listener, ErrorListener errorListener)
throws JSONException {
super(Method.POST,url, params, listener,
errorListener);
this.setShouldCache(Boolean.TRUE);
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这段代码足以让我得到隐式缓存的响应.我不确定它是否有效,因为我在发送请求时假设:
它会首先点击缓存并将其发送到响应
然后,当结果从远程服务器传来时,它会将其提供给响应
更新:
我想到了如何手动检索缓存并将其重建为JSONObject并通过OnResponse函数发送它,但考虑到隐式缓存,这似乎并不高效.JsonObjectRequest类应该返回JSONObject作为缓存条目而不是原始响应数据.
但我仍然有兴趣知道我是否犯了一些错误.
模糊性完全是由于缺乏文档,所以如果我遗漏了一些非常明显的东西,我会道歉.
当我使用JAVA时,我的页面跳转有问题,如果我使用:
response.sendRedirect("login.jsp")
Run Code Online (Sandbox Code Playgroud)
然后我得到这个网址: http://localhost:8080/login.jsp
但是,如果我使用
request.getRequestDispathcer("login.jsp").forward(request, response)
Run Code Online (Sandbox Code Playgroud)
然后我得到这个网址:( http://localhost:8080/Shopping/login.jsp"购物"是我模块的名称).
有什么不同?
我正在用PHP编写一个身份验证脚本,作为API调用,否则需要返回200 only in the case that it approves the request, and403 (Forbidden) or500`.
我200遇到的问题是php 在错误情况下返回,输出错误为html.500除非我自己显式返回HTTP 200或HTTP,否则如何确保php将返回HTTP 代码403?换句话说,我想将任何和所有警告或错误条件转换为500s,没有例外,以便默认情况下拒绝验证请求,并且异常是使用200代码批准它.
我摆弄set_error_handler()和error_reporting(),但至今没有运气.例如,如果代码在发送HTTP响应代码之前输出了某些内容,PHP自然会报告您在输出任何内容后无法修改标头信息.但是,这被PHP报告为200响应代码,其中html解释了该问题.我甚至需要把这种东西变成500代码.
这可能在PHP?或者我是否需要在mod_rewrite某种程度上以更高的级别执行此操作?如果是这样的话,任何想法我怎么设置它?
如果出现问题,我们正在使用HTTP状态代码作为响应代码开发标准REST服务.(例如,无效的用户输入会向客户端返回"400 Bad Request")
但是,我们认为更详细的错误消息对客户端有用.(例如,无效输入错误是由于X是无法识别的参数名称)
我们希望尽可能忠实于HTTP规范,因此在研究了RFC2616中的规范之后,我们考虑将详细的错误消息放在HTTP标头中,特别是在HTTP标头警告字段中.它在RFC上说:
Warning general-header字段用于携带有关消息的状态或转换的其他信息,这些信息可能未反映在消息中.此信息通常用于警告可能缺少来自缓存操作或应用于消息实体主体的转换的语义透明性.
对于其他警告(例如REST错误消息)使用此标头似乎没有任何限制,即使是根据此标头的初始意图与缓存警告无关的警告也是如此.我们喜欢语义,我们计划使用299警告代码,这似乎非常适合该法案:
299其他持久警告警告文本可能包含要呈现给人类用户或记录的任意信息.接收此警告的系统不得采取任何自动操作.
因此,鉴于此问题顶部显示的无效输入错误情况,我们正在考虑将REST错误消息添加如下示例:
HTTP/1.1 400 Bad Request
Warning: 299 ServiceName "Invalid input error: X is unrecognized parameter name."
Run Code Online (Sandbox Code Playgroud)
这是一个好主意/实践吗?我们还发现一些服务在X-Warning标题中详述了此消息,但这似乎不是标准的.我们想知道stackoverflow REST人群的蜂巢智慧会对此有何看法.在REST响应中传递详细的错误消息传递是否还有更好/标准化的做法?
我想从AJAX响应中下载以字节形式出现的文件.
我试图通过以下方式这样做Bolb:
var blob=new Blob([resultByte], {type: "application/pdf"});
var link=document.createElement('a');
link.href=window.URL.createObjectURL(blob);
link.download="myFileName.pdf";
link.click();
Run Code Online (Sandbox Code Playgroud)
它实际上是下载pdf文件但文件本身已损坏.
我怎么能做到这一点?
在ASPX页面中,我希望在特定点(不是由于错误条件)结束响应,具体取决于代码路径,以便在流中不发送任何其他内容.所以自然使用:
Response.End();
Run Code Online (Sandbox Code Playgroud)
这会导致ThreadAbortException,这是设计使然.
以下似乎有效,但看起来不像这个问题的正确方法:
Response.Flush();
Response.Close();
Run Code Online (Sandbox Code Playgroud)
那么,这个怎么样?
Response.Flush();
Response.SuppressContent = true
Run Code Online (Sandbox Code Playgroud)
然后让页面正常完成.
我可以处理并吞下ThreadAbortException,但我只是想知道SuppressContent方法是否有任何错误/陷阱?
编辑: 举几个例子.假设我有一个ASPX页面,我可以将内容类型更改为多种可能性之一.根据内容类型和方案,在代码中的给定点我想阻止将更多内容发送到客户端.假设在SuppressContent设置为true后,运行任何进一步的服务器端代码都没有问题.我只是不想将任何其他内容发送给客户端.
编辑2: MyPage.aspx - 有一个母版页,可能包括标准内容,页眉,页脚等.此页面可以呈现为普通页面.它还可以写出要下载的(例如)XML文档.如果写出一个XML文档(在页面加载时确定),它将清除输出,将内容类型设置为XML,将所有XML写出,然后如果正常,最终将使用其余的ASPX页面呈现为坚持到底 - 这显然不是必需的/打破XML.
编辑3: 现在我正在使用SuppressContent方法.为了尝试结束这个问题,我提出了一个赏金,并且会以另一种方式提出问题:你什么时候应该使用SuppressContent?为什么要使用它而不是Response.End?
请参阅我在下面提供的答案,我实际上最终得到了解决方案,因为我最终找到了一种方法来避免使用Response.End时出现ThreadAbortException.到目前为止,我已经排除了答案.
我有一个返回json响应的REST API.有时(以及似乎完全随机的),json响应会在中途被切断.所以返回的json字符串如下所示:
...route_short_name":"135","route_long_name":"Secte // end of response
Run Code Online (Sandbox Code Playgroud)
我很确定这不是编码问题,因为截止点会不断改变位置,具体取决于返回的json字符串.我没有找到一个特定的响应大小,要么发生切断(我看到65kb没有切断,而40kbs会).
在切断确实发生时查看响应头:
{
"Cache-Control" = "must-revalidate, private, max-age=0";
Connection = "keep-alive";
"Content-Type" = "application/json; charset=utf-8";
Date = "Fri, 11 May 2012 19:58:36 GMT";
Etag = "\"f36e55529c131f9c043b01e965e5f291\"";
Server = "nginx/1.0.14";
"Transfer-Encoding" = Identity;
"X-Rack-Cache" = miss;
"X-Runtime" = "0.739158";
"X-UA-Compatible" = "IE=Edge,chrome=1";
}
Run Code Online (Sandbox Code Playgroud)
也不响铃.任何人?
有人知道从Microsoft Edge中的ReadableStream创建新响应的方法吗?
对于Chrome,这非常简单.您可以在第一个参数ReadableStream的构造函数中获取并传递它Response.例如,您可以Response通过网络响应创建一个带有另一个状态代码的新代码,而无需复制响应:
fetch('https://www.baqend.com/')
.then(res => new Response(res.body, { status: 222 }))
.then(it => it.text())
.then(it => console.log('Text prefix ' + it.substr(0,16)))
.catch(it => console.log('error: ' + it))
Run Code Online (Sandbox Code Playgroud)
虽然这在Chrome中完美运行,但Edge不支持构造函数的ReadableStream输入Response.我在Edge中使用它的唯一方法是首先获得文本响应(有效地复制响应并阻止流):
fetch('https://www.baqend.com/')
.then(it => it.text())
.then(text => new Response(text, { status: 222 }))
.then(it => it.text())
.then(it => console.log('Text prefix ' + it.substr(0,16)))
.catch(it => console.log('error: ' + it))
Run Code Online (Sandbox Code Playgroud)
有没有人知道从Edge中的可读流创建新响应的方法?
PS:我正在使用Microsoft Edge 42.17115.1.0(最新的开发人员预览版,因为我正在测试Service Workers)
PPS:第一代码不工作在Firefox或者是因为Firefox不支持获取RedableStream的Response.body …