我目前正在构建REST API.所有GET方法目前都使用JSON作为响应格式.什么是POST和PUT操作的最佳实践?在请求正文或普通POST中使用JSON?我找不到任何关于此事的内容.
我看到Twitter使用POST,例如:https: //dev.twitter.com/docs/api/1/post/direct_messages/new
使用JSON格式有什么好处?我从github得到的API控制器(已完成一半)需要JSON.真想知道为什么我会选择使用它.
我对完整的架构理念有不同的疑问.我希望有经验的人可以帮助我,因为我几乎陷入了各种可能性.
我打算重写一个社区网站.我们的客户希望将来能够使用原生移动应用程序.所以我需要考虑到这一点.因此,我决定基于PHP框架Kohana创建一个100%REST API架构.我选择了Kohana,因为这样可以非常轻松地将内部API扩展到其他服务器而无需额外的努力.(Kohana威胁内部URL请求不是HTTP,因此开头没有太多开销,可以通过一些次要的代码更改扩展到HTTP).
起初,API将是私有的,但稍后我们可能会公开让更多服务轻松连接到我们.
De基本REST结构如下:
例如,'custom'可能是'孩子'.
同样的:
这些是API的完美实体,因为移动应用程序肯定会使用所有这些功能.
所以我们可以得出结论,网站的核心是REST.所以基本上我想让网站成为API的客户端,就像将来的本机应用程序一样.这样维护似乎更容易.
令我担心的是,除此之外还有更多(管理上传文件,发票,发票自动化,广告自动化等).上传文件需要通过网站访问API.这是常见做法吗?如果我不这样做,网站将上传逻辑,这使网站不再是客户端和应用程序本身.因此,移动应用程序甚至无法上传,API和网站都需要知道上传文件夹(重复逻辑).
我想到了创建以下模块:
Api似乎是核心.但是......那些cronjobs等呢?实际上他们不应该成为网站的一部分,因为这只是一个"客户".我觉得他们应该直接与模型或API进行交互.所以基本上API更像是通往核心的网关,并认为我需要这个:
核心cronjobs是REST结构的一个例外.他们是唯一一个可以在不通过api的情况下更改数据的人.至少这是我的想法,因为它们属于核心,而API则位于核心之上.
但设计似乎错了.操作应该只通过API!
替代方案:
这对我来说设计看起来更好. 思维导图插图http://mauserrifle.nl/mindmap.jpg
主要问题
1)
cronjobs应该通过API或Core模型进行操作吗?
2)
我的发票cronjob当然需要一个主要网站风格的模板.但如果我的cronjob是业务或核心的一部分,它将无法了解我的主要网站.解决这个问题有什么意义?
3)
我的网站将使用小胡子作为模板引擎.(php和javascript都可以解析这些模板).我认为直接使用api进行ajax调用,但后来意识到:
该站点从api获取数据,将时间戳格式化为模板的日期(Ymd),然后呈现.如果我让javascript直接调用api,javascript也必须有逻辑(格式化).这是重复的代码!感觉像唯一的解决方案是调用网站的ajax(调用api和格式)并返回格式化的json.我对吗?
但是....删除广告等简单的调用可以直接通过api(例如DELETE:/ ads/1
我收到各种电话....
对此更好的解决方案?
4)
总体而言:我的架构太复杂了吗?我应该考虑哪些替代方案?
我很想听听你的反馈!
Symfony4中的奇怪问题:Doctrine有效,我可以使用验证模式,创建数据库等php bin/console doctrine:schema:create.但我的PHPUnit测试没有连接.通过运行./bin/phpunit我得到SQLSTATE[HY000] [2002] No such file or directory例外.
我按照文档中有关启动内核的步骤进行操作:http: //symfony.com/doc/current/testing/doctrine.html
我的代码:
class PersistingResultTest extends KernelTestCase
{
protected $em;
protected function setUp()
{
$kernel = self::bootKernel();
$this->em = $kernel->getContainer()
->get('doctrine')
->getManager();
}
public function testPersistingLogFile()
{
// Just a simple schema command to test connection
$tool = new SchemaTool($this->em);
$tool->createSchema($this->em->getMetadataFactory()->getAllMetadata());
}
protected function tearDown()
{
parent::tearDown();
$this->em->close();
$this->em = null; // avoid memory leaks
}
}
Run Code Online (Sandbox Code Playgroud)
谁知道为什么会这样?一个bug?
编辑:
显然.env文件读取不正确.我将DATABASE_URL …
2013-05-29:更新了最新配置和额外信息的问题.之前我在虚拟机映像中进行测试.现在我正在测试生产性服务器,它更好地反映了现实世界.现在问题应该完全清楚了.如果您以前曾帮助我,请仔细阅读
目前我发现PostgreSQL中的查询速度非常慢,但我不明白它的速度有多慢.我把它缩小了一点,所以它在这里发布要小得多(而且速度要快得多,但仍然很慢!).
小背景:在这个项目中,我有属于用户的广告.用户是该国家/地区的一部分.一个区域可以有多个子区域,因此区域表是一棵树.将网络分配给区域.在网络上过滤时,它应该过滤该区域及其树中的所有区域子项.因为我无法查询无尽的树,所以我有一张桌子可以压扁这棵完整的树.
因此,通过1个查询,(SELECT area_id FROM network_area_flatdeep WHERE network_id = 1)我获得了属于网络1的所有区域:
63, 64, 65, 66, 67, 68, 69, 70
这使得查询变得非常容易.
慢查询(在测试所有内容之前一直是VACUUM ANALYZED):
EXPLAIN ANALYZE SELECT a0_.id AS id0
FROM advert a0_
INNER JOIN member m6_
ON a0_.user_id = m6_.id
INNER JOIN area a7_
ON m6_.area_id = a7_.id
WHERE a0_.status IN ( 1 )
AND m6_.status IN ( 1 )
AND a7_.id IN (SELECT area_id FROM network_area_flatdeep WHERE network_id IN (1))
ORDER BY a0_.created_date DESC
LIMIT 60;
QUERY PLAN …Run Code Online (Sandbox Code Playgroud) 我目前有一个由于OR语句而缓慢的postgresql查询.它显然没有使用索引.到目前为止,重写此查询失败.
查询:
EXPLAIN ANALYZE SELECT a0_.id AS id0
FROM advert a0_
INNER JOIN advertcategory a1_
ON a0_.advert_category_id = a1_.id
WHERE a0_.advert_category_id IN ( 1136 )
OR a1_.parent_id IN ( 1136 )
ORDER BY a0_.created_date DESC
LIMIT 15;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.00..27542.49 rows=15 width=12) (actual time=1.658..50.809 rows=15 loops=1)
-> Nested Loop (cost=0.00..1691109.07 rows=921 width=12) (actual time=1.657..50.790 rows=15 loops=1)
-> Index Scan Backward using advert_created_date_idx on advert a0_ (cost=0.00..670300.17 rows=353804 width=16) (actual time=0.013..16.449 rows=12405 loops=1)
-> Index Scan using advertcategory_pkey on …Run Code Online (Sandbox Code Playgroud) php ×4
doctrine-orm ×2
postgresql ×2
rest ×2
api ×1
architecture ×1
hmvc ×1
json ×1
kohana ×1
post ×1
sql ×1
symfony ×1
symfony4 ×1