PHP-Swagger параметры запроса

в своем Zend-приложении я пишу небольшой API для мобильных приложений.
Для удобства разработчиков мобильных приложений я использую Swagger.
До сих пор все работает отлично, кроме одного GET-запроса.

Когда я звоню / user / messages / {sessionToken}? NumMessages = {numMessages}&pageNr = {pageNr} в браузере я получаю требуемые результаты, но когда я пытаюсь позволить Swagger выполнить этот запрос, передается только sessionToken. Я попробовал это аннотации для Swagger:

/**
* @SWG\Api(path="/user/messages/{sessionToken}?numMessages={numMessages}&pageNr={pageNr}",
*   @SWG\Operation(
*     method="GET",
*     summary="Gets messages paged",
*     notes="",
*     type="string",
*     nickname="getUsermessagesPaged",
*     authorizations={},
*     @SWG\Parameter(
*       name="sessionToken",
*       description="The token from an active user session",
*       required=true,
*       type="string",
*       paramType="path",
*       allowMultiple=true
*     ),
*     @SWG\Parameter(
*       name="numMessages",
*       description="number of messages on page (numMessages & pageNr are ignored if not both are set)",
*       required=true,
*       type="string",
*       paramType="query",
*       allowMultiple=true
*     ),
*     @SWG\Parameter(
*       name="pageNr",
*       description="pagenumber (numMessages & pageNr are ignored if not both are set)",
*       required=true,
*       type="string",
*       paramType="query",
*       allowMultiple=true
*     ),
*     @SWG\ResponseMessage(code=200, message="json {messages => 'user_messages'}"),
*     @SWG\ResponseMessage(code=400, message="json with error 'not logged in'")
*   )
* )
*/

Кто-нибудь видит мою ошибку?

Любая помощь приветствуется.

С уважением

rholtermann

Обновление: как предложено, я изменил оба paramTypes на «запрос» и изменил путь:

@SWG\Api(path="/user/messages/{sessionToken}",

но это не сработало.

xdebug в eclipse PDT показывает:

requestURI => /ias/public/user/messages/{sessionToken}

а также

- queryParams => Zend\\Stdlib\\Parameters
- *ArrayObject*storage => Array[0]
-  => <Uninitialized>

чванство JSON это:

{
"apiVersion": "1.0.0",
"swaggerVersion": "1.2",
"apis": [
{
"path": "\/user",
"description": "Operations about users"}
],
"info": {
"title": "Mobile access api",
"description": "This is the xxx mobile access api.",
"termsOfServiceUrl": null,
"contact": "xxx",
"license": null,
"licenseUrl": null,
"_partialId": null,
"_partials": [ ],
"_context": {
"comment": "\/**\ * @SWG\\Info(\ * title="Mobile access api",\ * description="This is the xxx mobile access api.",\ * contact="xxx",\ * )\ *\/",
"line": 3
}
}
}

Вот результат вывода / user:

 {
"basePath": "http://localhost/ias/public",
"swaggerVersion": "1.2",
"apiVersion": "1.0.0",
"resourcePath": "/user",
"apis": [
{
"path": "/user/balance/{sessionToken}",
"operations": [
{
"method": "GET",
"summary": "Gets userbalance",
"nickname": "getUserdata",
"type": "string",
"parameters": [
{
"paramType": "path",
"name": "sessionToken",
"type": "string",
"required": true,
"allowMultiple": false,
"description": "The token from an active user session"}
],
"responseMessages": [
{
"code": 200,
"message": "json {balance => 'user_balance'}"},
{
"code": 400,
"message": "json with error 'not logged in'"}
],
"notes": "",
"authorizations": {}
}
]
},
{
"path": "/user/login",
"operations": [
{
"method": "POST",
"summary": "Logs user into the system",
"nickname": "loginUser",
"type": "string",
"parameters": [
{
"paramType": "form",
"name": "email",
"type": "string",
"required": true,
"allowMultiple": false,
"description": "The user email for login"},
{
"paramType": "form",
"name": "password",
"type": "string",
"required": true,
"allowMultiple": false,
"description": "The password for login in clear text"}
],
"responseMessages": [
{
"code": 200,
"message": "json with session_id, user_id, user_balance"},
{
"code": 400,
"message": "json with error 'no user with given email and password'"},
{
"code": 400,
"message": "json with error 'invalid input'"},
{
"code": 400,
"message": "json with error 'no post request'"}
],
"notes": "",
"authorizations": {}
}
]
},
{
"path": "/user/logout",
"operations": [
{
"method": "POST",
"summary": "Logs user out",
"nickname": "logoutUser",
"type": "string",
"parameters": [
{
"paramType": "form",
"name": "sessionToken",
"type": "string",
"required": true,
"allowMultiple": false,
"description": "The token from an active user session"}
],
"responseMessages": [
{
"code": 200,
"message": "json {result => 'deleted'}"},
{
"code": 400,
"message": "json with error 'no user_session with given sid'"},
{
"code": 400,
"message": "json with error 'invalid input'"},
{
"code": 400,
"message": "json with error 'no post request'"}
],
"notes": "",
"authorizations": {}
}
]
},
{
"path": "/user/messages/{sessionToken}",
"operations": [
{
"method": "GET",
"summary": "Gets new messages",
"nickname": "getUsermessages",
"type": "string",
"parameters": [
{
"paramType": "path",
"name": "sessionToken",
"type": "string",
"required": true,
"allowMultiple": false,
"description": "The token from an active user session"}
],
"responseMessages": [
{
"code": 200,
"message": "json {messages => 'user_messages'}"},
{
"code": 400,
"message": "json with error 'not logged in'"}
],
"notes": "",
"authorizations": {}
},
{
"method": "GET",
"summary": "Gets messages paged",
"nickname": "getUsermessagesPaged",
"type": "string",
"parameters": [
{
"paramType": "path",
"name": "sessionToken",
"type": "string",
"required": true,
"description": "The token from an active user session"},
{
"paramType": "query",
"name": "numMessages",
"type": "string",
"required": true,
"description": "number of messages on page (numMessages & pageNr are ignored if not both are set)"},
{
"paramType": "query",
"name": "pageNr",
"type": "string",
"required": true,
"description": "pagenumber (numMessages & pageNr are ignored if not both are set)"}
],
"responseMessages": [
{
"code": 200,
"message": "json {messages => 'user_messages'}"},
{
"code": 400,
"message": "json with error 'not logged in'"}
],
"notes": "",
"authorizations": {}
}
]
},
{
"path": "/user/userdata",
"operations": [
{
"method": "POST",
"summary": "Posts userdata",
"nickname": "postUserdata",
"type": "string",
"parameters": [
{
"paramType": "form",
"name": "sessionToken",
"type": "string",
"required": true,
"allowMultiple": false,
"description": "The token from an active user session"},
{
"paramType": "form",
"name": "password",
"type": "string",
"required": false,
"allowMultiple": false,
"description": "new password"},
{
"paramType": "form",
"name": "address",
"type": "string",
"required": false,
"allowMultiple": false,
"description": "new address"},
{
"paramType": "form",
"name": "housenr",
"type": "string",
"required": false,
"allowMultiple": false,
"description": "new housenr"},
{
"paramType": "form",
"name": "zip",
"type": "string",
"required": false,
"allowMultiple": false,
"description": "new zip"},
{
"paramType": "form",
"name": "city",
"type": "string",
"required": false,
"allowMultiple": false,
"description": "new city"},
{
"paramType": "form",
"name": "email",
"type": "string",
"required": false,
"allowMultiple": false,
"description": "new email"}
],
"responseMessages": [
{
"code": 200,
"message": "json {user => 'userdata'}"},
{
"code": 400,
"message": "json with error 'not logged in'"}
],
"notes": "",
"authorizations": {}
}
]
},
{
"path": "/user/userdata/{sessionToken}",
"operations": [
{
"method": "GET",
"summary": "Gets userdata",
"nickname": "getUserdata",
"type": "string",
"parameters": [
{
"paramType": "path",
"name": "sessionToken",
"type": "string",
"required": true,
"allowMultiple": false,
"description": "The token from an active user session"}
],
"responseMessages": [
{
"code": 200,
"message": "json {user => 'userdata', user_limit => 'userLimits'}"},
{
"code": 400,
"message": "json with error 'not logged in'"}
],
"notes": "",
"authorizations": {}
}
]
}
],
"produces": [
"application/json"]
}

Кажется, ошибка в том, что мой пользовательский интерфейс не отправляет параметры запроса?
Вот пример только с одним параметром запроса, sessionToken:
(отслеживается FireBug 2.0.6)

GET /ias/public/user/balance HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0
Accept: application/json
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/json
Referer: http://localhost/ias/swagger/
Cookie: __utma=111872281.581414660.1366700677.1394721873.1394723866.255; uvts=sB5Dda3cZBNdaTk; searchpanel-close=set
Connection: keep-alive

Ответ был:

HTTP/1.1 400 Bad Request
Date: Tue, 25 Nov 2014 14:58:20 GMT
Server: Apache/2.4.9 (Win32) PHP/5.5.12
X-Powered-By: PHP/5.5.12
Content-Length: 25
Connection: close
Content-Type: application/json; charset=utf-8

Ответ был правильным, потому что не было передано sessionToken.

Этот запрос работает, но не от swagger-ui:

GET /ias/public/user/balance?sessionToken=54275cc6358e42c4b1fb1d8daf850b52 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: __utma=111872281.581414660.1366700677.1394721873.1394723866.255; uvts=sB5Dda3cZBNdaTk; searchpanel-close=set
Connection: keep-alive

2

Решение

Измените первую строку на:

* @SWG\Api(path="/user/messages/{sessionToken}",

Swagger не поддерживает параметры запроса как часть самого пути. Они будут добавлены в запрос (из пользовательского интерфейса) автоматически, так как они описаны как query тип.

1

Другие решения

Я думаю, что вы пропали без вести

paramType="query",

в

paramType="path",

Я думаю, что это решит вашу проблему

0

Проблема решена, решением было обновить swagger-ui.

После обновления в приложение были отправлены параметры запроса, и все работает нормально.

Спасибо всем, кто пытался решить мою проблему.

С уважением
rholtermann

0
По вопросам рекламы [email protected]