通过REST API提供多种图像分辨率

时间:2014-05-07 21:06:26

标签: android ios image rest resolution

我们正在开发一个REST API,作为iOS和Android应用程序的后端以及AngularJS Web应用程序。为了优化性能,我们必须提供各种分辨率的图像。我正在寻找有关如何为客户端提供其设备分辨率的正确图像URL的指导。我可以想象三种可能性:

1。客户端具有确定图像的分辨率相关URL的逻辑。
REST API返回规范图像URL:

{
   "user": {
      "id": 1,
      "image_profile": "https://cdn.mydomain.com/abcd.jpg"
   }
}

然后,客户端知道如何更改URL以获得所需的解决方案 例如。例如:https://cdn.mydomain.com/abcd@2x.jpghttps://cdn.mydomain.com/w_100,h_100/abcd.jpg

这是基于这样的想法,即客户知道图像的确切位置以及所需的大小和分辨率。缺点是客户端更具逻辑性。例如,这可以通过http://cloudinary.com/等服务来实现。

2。服务器为每个图像提供不同的版本。
REST API返回所有可用的图像URL:

{
   "user": {
      "id": 1,
      "image_profile": {
         "url": "https://cdn.mydomain.com/abcd.jpg",
         "versions": {
            "mhdpi": "https://cdn.mydomain.com/abcd_mhdpi.jpg",
            "lhdpi": "https://cdn.mydomain.com/abcd_lhdpi.jpg",
            "2x": "https://cdn.mydomain.com/abcd@2x.jpg",
            "web": "https://cdn.mydomain.com/abcd_web.jpg"
         }
      }
   }
}

在此解决方案中,客户端需要较少的逻辑,并且调整图像大小的实现独立于客户端。回应变得有点污染。

第3。服务器根据用户代理(或任何其他参数)自动返回正确的图像
客户端可以在用户代理标头中指定其预期的分辨率(或者可以向每个请求添加?resolution=2x之类的内容 对于iPhone 5S (iOS 7.1)的示例用户代理,API会自动返回正确的图像:

{
   "user": {
      "id": 1,
      "image_profile": "https://cdn.mydomain.com/abcd@2x.jpg"
   }
}

客户端无视分辨率问题,但这种方法使得响应更少可缓存,并且感觉最像魔术。

您能否提出其他解决方案,详细说明所提供的解决方案的优缺点,并指出一些有关众所周知的API如何处理此问题的资源?

1 个答案:

答案 0 :(得分:4)

第二个选项与RESTful API设计最接近,具有随之而来的固有优势。

轮流拍摄:

<强> 1。如果您因任何原因需要更改图像标识符URL格式,则客户更改网址可能会导致您破坏客户端。

<强> 2。服务器提供多个版本最好与RESTful方法保持一致,其主要好处是更改URL格式不会破坏现有客户端。它还允许可扩展性,这可能是自我描述性的和机器可读的(具有小的变化),如下所示:

{
   "user": {
      "id": 1,
      "image_profile": {
         "url": "https://cdn.mydomain.com/abcd.jpg",
         "versions": {
            "100": "https://cdn.mydomain.com/abcd_mhdpi.jpg",
            "150": "https://cdn.mydomain.com/abcd_lhdpi.jpg",
            "300": "https://cdn.mydomain.com/abcd@2x.jpg",
            "72": "https://cdn.mydomain.com/abcd_web.jpg"
         }
      }
   }
}

...即。您可以将标识符重新定义为&#34; DPI&#34;数字或类似的东西。我不知道您的客户端应用程序有多先进;但他们可能会寻找数字最近的匹配&#34; DPI用于使用的屏幕尺寸。然后,您可以相应地插入其他分辨率。

第3。服务器使用代理字符串避免了选项1的风险;但客户端应用程序本身最适合做出解决方案的决定,因为它更了解上下文。

摘要

选项2并不以任何方式限制您;并且也是避免在未来发生变化的最有弹性的。