我有一个有点昂贵的服务器端操作,它产生一个图像和一些关于该图像的相关文本元数据。我的网页将同时显示。
使用AJAX调用获取图像及其数据。在服务器端,可以同时生成图像和元数据。如何通过一次AJAX调用传输(并显示)图像和数据?
(进行两次调用的问题是昂贵的服务器端操作最终会在没有必要的情况下发生两次。)
编辑: 为了澄清,图像是在servlet中动态绘制的。如果它具有与元数据不同的URL,则需要两个请求,并且昂贵的操作发生两次。我不想在servlet中编写自己的缓存,因为使用缓存代理并且max-age工作得很好。
答案 0 :(得分:2)
如果两个进程共享相同的资源URL,则可以将元数据作为自定义HTTP标头发送。我不完全确定以下技术。
无论如何,即使浏览器机制不起作用,至少缓存代理有可能缓存单个响应,而不是其他两个响应。
,虽然你说你不想使用base64编码的图像,但是有techniques to determine whether a browser supports them或不是{{3}}。然后,您可以将它们用于足够智能的浏览器,并为其他浏览器牺牲双重请求。至少情况并非如此糟糕。
如果您已经依赖缓存代理和max-age标头,那么这就是我要做的事情:
我真的不明白“制作图像”是什么意思,但我假设您只想将图像URL发送回网页。在这种情况下,您可以使用JSON发送图像URL和元数据。像这样:
{
"url" : "http://example.com/image.png",
"meta" : {
"type" : "png",
"width" : "200px",
"height" : "200px"
}
}
一旦两个服务器端操作完成,您就会发送此响应。您可以使用单个Ajax请求启动这两个请求,并立即获取映像URL和元数据的响应。然后,在客户端,您可以非常轻松地阅读它们:
var response = eval(xhr.responseText);
var url = response.url;
var imageType = response.meta.type;
上面会在onreadystatechange处理程序中发生。如果您使用的是库,那么事情会更容易。
答案 1 :(得分:0)
执行此操作的最佳方法是创建一个新的封装对象,该对象将这两个对象作为属性返回。所以ImageContainer.Image和ImageContainer.Metadata将为您提供所需的功能。
我回答了类似的问题here。