免责声明:这是针对Prestashop 1.5,但如果答案是:“这在版本1.x中得到修复”,那么我将提出请愿更新我们的商店 . 我也将它标记为REST因为我认为我已经足够解释它所以你不需要Prestashop的实际经验来理解它 .


所以在Prestashop中我们有这个Web服务,它缺乏对 search by category 之类的用例的支持 .

1. Let's say you want to get all the products from categories 1, 3 and 17:

那么解决方案是什么?那么,你可以在这个答案中做点什么:https://stackoverflow.com/a/34061229/4209853

如果您从第1类,第3类和第17类获得所有产品,那么您再次要求按照这些ID过滤产品 .

'filter[id]' => '['.implode('|',$productIDsArrayIGotBefore).']',

它是丑陋的,20世纪的,但是......如果它完成了工作......除了它没有 . 你知道,这是一个获取资源的呼吁,某个地方有人决定:

嘿,我们有所有这些好的HTTP动作动词,所以让我们将它们用于REST CRUD接口:POST为C,GET为R,PUT为U和DELETE为D. Neat .

这很好,但是当与Prestashop的Web服务缺乏表现力相结合意味着它很容易碰到,你猜对了吗?是的,414 .

Error HTTP 414 Request URI too long

我们都知道修改Apache以便它接受更长的请求URI是一个整洁的可扩展解决方案 .

所以我们可以尝试拆分数组并进行多次调用,这只是概念上的呃 . 这不仅仅是因为多次查询的性能受到影响,还因为我们需要考虑连接的所有ID的字符数,以便计算我们可以(安全地)在一次调用中请求的数量 . 所有这些都会有自己的警告,例如:

2. What if we want to also filter them e.g. active=1?

现在我们正在乘车,因为我们事先无法知道需要拨打多少电话 .

我们来定义:

  • N 是我从类别中获得的ID

  • n 是我可以安全要求的IDS号码

  • T 是我想要的(过滤的)产品数量

  • t 是我已经拥有的(已过滤)产品

  • k 是我们从通话中收到的(已过滤)产品

所以我们最终得到的结果如下:

do{
    n0= max(T-t, n);
    k= get(products, n0);
    t +=k;
}while(count(k)!=0 and count(t)<T and !empty(N))

..这只是......疯子 .

我能想到的唯一优雅的解决方案是创建一个新的Prestashop Web服务,它充当包装器,通过POST接收请求并将其转发到Prestashop服务 .

但是,之前...你有一个更好的解决方案使用某种RESTomancy我可能会失踪?