2014-11-24 62 views
2

我正在为移动应用程序编写一个小API。 为了方便我使用Swagger的移动开发者。 到目前为止,除了一个GET请求外,一切正常。在我的Zend应用程序中的PHP Swagger查询参数

当我在浏览器中调用/ 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}", 

,但它没有工作eighter。

在eclipse PDT的XDebug示出:

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 
     } 
    } 
} 

这里是/用户的个输出:

{ 
    "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" 
    ] 
} 

错误似乎是,我的swagger-ui不发出任何查询参数? 这是一个只有一个查询PARAM为例,sessionToken: (由萤火虫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被传送。

这就要求的作品,但它不会从招摇的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 
+0

有一件事还不清楚是当你观察到的问题。它是什么时候你的应用程序启动?它是否在运行Swagger-UI操作? – Ron 2014-11-25 11:47:54

+0

当我运行Swagger-UI操作时,它不起作用,当我使用Chrome邮递员执行请求时,一切都很好。 – rholtermann 2014-11-25 12:22:01

+0

好的。主要的问题是/ user/messages/{sessionToken}上有两个GET操作。我假设你使用了我并不熟悉的swagger-php,所以我不能告诉你为什么这么做,不幸的是。 – Ron 2014-11-25 12:26:07

回答

0

问题解决了,解决办法是更新swagger-ui。

更新后,查询参数已发送到应用程序,一切工作正常。

感谢大家试图解决我的问题。

亲切的问候 rholtermann

0

我认为你缺少

paramType="query", 

paramType="path", 

我认为这将解决您的问题

+0

谢谢你的回答,但那并不奏效,我之前曾尝试过。我将所有三个参数类型都设置为路径,但参数“numMessages”和“pageNr”在两种情况下均未传输。 – rholtermann 2014-11-24 12:38:48

+0

你是否在控制台中检查了什么传递? – 2014-11-24 12:41:02

+0

allowMultiple = true删除这个,然后尝试 – 2014-11-24 12:44:06

1

更改第一行为:

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

Swagger不支持将查询参数作为路径本身的一部分。它们将被自动添加到请求中(来自UI),因为它们被描述为query类型。

+0

谢谢你的回答,但它并不奏效。我检查了xdebug中的请求参数并没有提交任何参数。你有其他想法吗? – rholtermann 2014-11-25 10:14:54

+0

是的。你能修改你的问题并添加你从应用程序中获得的Swagger JSON吗? – Ron 2014-11-25 10:19:02

+0

改变了它。但我有点困惑的API调用不显示? – rholtermann 2014-11-25 10:42:50

相关问题