我正在学习Apigility(Apigility docu - > REST Service Tutorial)并尝试通过cURL发送带有基本身份验证的POST请求:
$ curl -X POST -i -H "Content-Type: application/hal+json" -H "Authorization: Basic YXBpdXNlcjphcGlwd2Q=" http://apigilityhw.sandbox.loc/status
Run Code Online (Sandbox Code Playgroud)
YXBpdXNlcjphcGlwd2Q=是我的凭据的基本64编码字符串apiuser:apipwd.凭证保存在/data/htpasswd(apiuser:$apr1$3J4cyqEw$WKga3rQMkxvnevMuBaekg/)中.
看起来像这样:
HTTP/1.1 401 Unauthorized
Server: nginx/1.4.7
Date: Mon, 22 Sep 2014 07:48:47 GMT
Content-Type: application/problem+json
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.5.12-1~dotdeb.1
WWW-Authenticate: Basic realm="api"
Run Code Online (Sandbox Code Playgroud)
这里的错误在哪里?如何让它工作?
我使用Apigility创建了一个API.我正在尝试为我目前正在使用API构建的前端应用程序设置身份验证系统.
但是我用于此身份验证系统的所有角度身份验证模块都与Apigility oAuth 2实现不匹配:
https://github.com/lynndylanhurley/ng-token-auth该模块的问题是,它不允许CORS.但是它允许在角度代码所在的服务器上使用代理发送CORS-Request,我使用Guzzle用PHP编写.但是使用代理ng-token-auth发送请求两次成功,即使所有身份验证数据都是假的.
https://github.com/sahat/satellizer这个模块需要JWT的实现,但在Apigility Authentication部分我还没有看到任何文档.
我需要帮助来完成我的项目.
我在基于名为Apigility的ZF2(Zend Framework 2)的框架中编写了一个API.
我的服务可以查询第三方API.偶尔,我会收到一条500错误消息..要么是因为过期的令牌,要么是等等.
我的API如何回应我的客户?
我一开始以为我应该回500,但实际上这似乎是错的.我不想返回一个错误,表明我已经崩溃了......这是第三方有500的.
更新:下面是我从第三方看到的.
我想我喜欢...的想法,503 Service unavailable错误信息告诉用户什么是错的,以及如何解决它.
更新显示第三方的回复:
Error performing request to OAuth Provider.
HTTP/1.1 500 Internal Server Error
Server: nginx/1.1.19
Date: Fri, 22 Aug 2014 20:24:40 GMT
Content-Type: text/html
Content-Length: 20
Connection: close
X-Powered-By: PHP/5.3.10-1ubuntu3.1
Set-Cookie: lang_select_language=en; Expires=Sun, 21-Aug-2016 20:24:42 GMT; Path=/
X-WI-SRV: FR-EQX-WEB-03
Vary: Accept-Encoding
Content-Encoding: gzip
Run Code Online (Sandbox Code Playgroud)
思考?
/**
* Status titles for common problems
*
* @var array
*/
protected $problemStatusTitles = array(
// CLIENT ERROR
400 => 'Bad Request',
401 => …Run Code Online (Sandbox Code Playgroud) 我想创建一个Apigility REST服务,该服务接受例如用户对象的POST,该用户对象具有包含地址对象数组的字段.我可以在没有验证器的情况下定义字段并在我的代码中处理原始JSON,但是我想知道是否有更好的方法来执行此操作,嵌套对象也可以通过Apigility进行验证?
我正在尝试为Apigility服务编写子路由,所有路由都很好,直到呈现_self链接为止.
GET http://host/api/service/parameter/gui/page
{
"status": 500,
"title": "Unexpected error",
"describedBy": "http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html",
"detail": "Missing parameter \"parameter\"",
"details": {
"code": 0,
"message": "Missing parameter \"parameter\"",
"trace": "#0 /vagrant/vendor/zendframework/zendframework/library/Zend/Mvc/Router/Http/Segment.php(313): Zend\\Mvc\\Router\\Http\\Segment->buildPath(Array, Array, true, true, Array)\n#1 /vagrant/vendor/zendframework/zendframework/library/Zend/Mvc/Router/Http/Segment.php(409): Zend\\Mvc\\Router\\Http\\Segment->buildPath(Array, Array, false, true, Array)\n#2 /vagrant/vendor/zendframework/zendframework/library/Zend/Mvc/Router/Http/Part.php(197): Zend\\Mvc\\Router\\Http\\Segment->assemble(Array, Array)\n#3 /vagrant/vendor/zendframework/zendframework/library/Zend/Mvc/Router/Http/TreeRouteStack.php(351): Zend\\Mvc\\Router\\Http\\Part->assemble(Array, Array)\n#4 /vagrant/vendor/zendframework/zendframework/library/Zend/View/Helper/Url.php(100): Zend\\Mvc\\Router\\Http\\TreeRouteStack->assemble(Array, Array)\n#5 [internal function]: Zend\\View\\Helper\\Url->__invoke('parent.rest.s...', Array, Array, true)\n#6 /vagrant/vendor/zfcampus/zf-hal/src/Plugin/Hal.php(610): call_user_func(Object(Zend\\View\\Helper\\Url), 'parent.rest.s...', Array, Array, true)\n#7 /vagrant/vendor/zfcampus/zf-hal/src/Plugin/Hal.php(634): ZF\\Hal\\Plugin\\Hal->fromLink(Object(ZF\\Hal\\Link\\Link))\n#8 /vagrant/vendor/zfcampus/zf-hal/src/Plugin/Hal.php(667): ZF\\Hal\\Plugin\\Hal->fromLinkCollection(Object(ZF\\Hal\\Link\\LinkCollection))\n#9 /vagrant/vendor/zfcampus/zf-hal/src/Plugin/Hal.php(525): ZF\\Hal\\Plugin\\Hal->fromResource(Object(ZF\\Hal\\Entity))\n#10 /vagrant/vendor/zfcampus/zf-hal/src/View/HalJsonRenderer.php(117): ZF\\Hal\\Plugin\\Hal->renderEntity(Object(ZF\\Hal\\Entity))\n#11 /vagrant/vendor/zendframework/zendframework/library/Zend/View/View.php(205): ZF\\Hal\\View\\HalJsonRenderer->render(Object(ZF\\Hal\\View\\HalJsonModel))\n#12 /vagrant/vendor/zendframework/zendframework/library/Zend/Mvc/View/Http/DefaultRenderingStrategy.php(102): Zend\\View\\View->render(Object(ZF\\Hal\\View\\HalJsonModel))\n#13 [internal function]: Zend\\Mvc\\View\\Http\\DefaultRenderingStrategy->render(Object(Zend\\Mvc\\MvcEvent))\n#14 /vagrant/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(468): call_user_func(Array, Object(Zend\\Mvc\\MvcEvent))\n#15 /vagrant/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(207): Zend\\EventManager\\EventManager->triggerListeners('render', …Run Code Online (Sandbox Code Playgroud) 我想将Doctrine 2集成到Apigility驱动的Zend Framework 2应用程序中.
所以我安装了zfcampus/zf-apigility-doctrine
$ composer require zfcampus/zf-apigility-doctrine "~0.3"
Run Code Online (Sandbox Code Playgroud)
并激活模块Phpro\DoctrineHydrationModule,ZF\Apigility\Doctrine\Server和ZF\Apigility\Doctrine\Admin应用程序配置文件(/config/application.config.php和/config/development.config.php).
接下来应该在应用程序中开始使用Doctrine,特别是在Apigility Admin区域中应该做什么?
我正在使用ZF2 Apigility,我正在为我正在编写的API设置OAuth2工作流程.
到目前为止,我可以得到以下工作:
调用API并获取令牌
{
"access_token": "62f6109dcbce42b38f9117b21529faf30fc0ee86",
"expires_in": 3600,
"token_type": "Bearer",
"scope": null
}
Run Code Online (Sandbox Code Playgroud)现在我知道我需要在下一个请求的标题中使用此标记才能访问我的API.
我只是不确定如何使用PostMan进行此操作?
我用Apigility创建了一个代码连接的API.现在我正在使用标准的创建存根.在我PostResource的方法中有一个叫做的方法fetchAll($params = array()).我为方法创建了代码,以便返回一组可分页的结果:
/** @var HydratorInterface $hydrator */
$hydrator = new \Zend\Stdlib\Hydrator\ClassMethods();
/** @var PostService $postService */
$postService = new PostService();
$posts = $postService->findAll(/* Limit, default 10 */);
$apiData = array();
foreach ($posts as $post) {
$apiData[] = $hydrator->extract($post);
}
return new Paginator(new ArrayAdapter($apiData));
Run Code Online (Sandbox Code Playgroud)
这到目前为止工作正常.如果我导航到API URL,我将获得json我的数据库数据的分页表示.如果我将我的API的页面大小设置为5.它将给我2页和5个结果.到现在为止还挺好.问题是,在每次调用(第1页或第2页)时,将从数据库中提取所有10个结果.它只返回一页5,但10水合等.
有没有办法使用限制,但也让Apigility或分页器知道,总共有多少结果,这样我将得到5行,仍然是分页?
我刚开始使用Apigility和oAuth2,我想知道从数据库中获取信息时是否有可能获得当前经过身份验证的"登录"用户.
我目前有以下代码:
/**
* Fetch all or a subset of resources
*
* @param array $params
* @return mixed
*/
public function fetchAll($params = array())
{
var_dump($params);
// Using Zend\Db's SQL abstraction
$sql = new \Zend\Db\Sql\Sql($this->db);
//I would like to get the currently logged in user here... but how?
$select = $sql->select('projects')->where(array('userid' => 1));;
// This provides paginated results for the given Select instance
$paged = new \Zend\Paginator\Adapter\DbSelect($select, $this->db);
// which we then pass to our collection
return new ProjectsCollection($paged); …Run Code Online (Sandbox Code Playgroud) 我即将开始使用rest API进行应用程序,我想使用apigility.不幸的是,这个想法存在一个问题.我无法找到可靠的信息来源,如何允许oAuth对普通用户进行身份验证.
我需要为角度应用和原生移动设备提供访问权限(可能在将来用于第三方Web应用程序).我找到的所有资源都是关于为特定客户端应用程序授予对api的访问权限,而不是为使用此应用程序的特定用户授予访问权限.我不想实现两种不同的身份验证方法,所以如果有办法用apigility来解决这个问题,那就太棒了.
您对此有何建议?我知道我可以为所有注册用户生成客户端ID和密码,但是这会产生一些糟糕的解决方案,并且我已经有了用于存储用户信息的数据库模式.
我正在使用ApiGility更新购物篮产品和数量,并正在使用Chromes Postman进行测试.
我正在使用PUT方法将表单数据发送到api并继续收到以下错误:
JSON decoding error: Syntax error, malformed JSON
Run Code Online (Sandbox Code Playgroud)
这是我的PostMan设置的屏幕截图:

我已经尝试将Content-Type设置为Text但是然后我得到"指定了无效的内容类型"错误.
有没有办法让PostMan发送Json?
在Apigility驱动的ZF2应用程序中,我想使用自定义Hydrator.
Module 类
class Module implements ApigilityProviderInterface {
...
public function getServiceConfig() {
return array(
'factories' => array(
...
'MyNamespace\\Hydrator\\ProjectHydrator' => function(ServiceManager $serviceManager) {
$projectHydrator = new ProjectHydrator();
$projectHydrator->setImageService($serviceManager->get('Portfolio\V2\Rest\ImageService'));
return $projectHydrator;
}
),
...
);
}
}
Run Code Online (Sandbox Code Playgroud)
module.config.php
...
'zf-hal' => array(
'metadata_map' => array(
...
'Portfolio\\V2\\Rest\\Project\\ProjectEntity' => array(
'entity_identifier_name' => 'id',
'route_name' => 'portfolio.rest.project',
'route_identifier_name' => 'id',
// 'hydrator' => 'Zend\\Stdlib\\Hydrator\\ClassMethods',
'hydrator' => 'MyNamespace\\Hydrator\\ProjectHydrator',
),
...
),
),
...
Run Code Online (Sandbox Code Playgroud)
当一个集合被检索时,它被忽略了,但它是另一个问题(s.here).当需要单个实体时,waterratin机制启动,但它不使用我的工厂,以创建实例.
经过一些调试后,我来到了ZF\Hal\Metadata\Metadata#setHydrator(...)代码中的这个地方:
if (is_string($hydrator)) …Run Code Online (Sandbox Code Playgroud) 我有一个关于验证嵌套json数据的小问题.例如,我有类似的PATCH请求:
{
"awesome": "yes",
"myObject": {
"some_property": "Text Example value",
"another_property": "1965"
}
}
Run Code Online (Sandbox Code Playgroud)
什么是设置过滤器和校验此嵌套数据的正确,也许正确的方式some_property和another_property?
非常感谢您的回答