1

I'm trying to use Swagger to create the spec for a Connexion API (Python+Flask). Great tools. I know that HTTP Request Headers** are not passed to the handler functions as regular parameters but I need to be able to get request headers from the operations. I read https://connexion.readthedocs.io/en/latest/request.html#header-parameters . I used the Swagger Editor to generate a minimal python server (proof of concept) but it doesn't work from the scratch, it may be a problem in requirements:

The default requirements.txt doesn't allow me to launch the server, showing this error message:

$ python3 -m swagger_server
Traceback (most recent call last):
  File "/usr/lib/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/agalindodev/tmp/python-flask-server/swagger_server/__main__.py", line 3, in <module>
    import connexion
  File "/home/agalindodev/tmp/python-flask-server/venv/lib/python3.6/site-packages/connexion/__init__.py", line 3, in <module>
    from .apis import AbstractAPI  # NOQA
  File "/home/agalindodev/tmp/python-flask-server/venv/lib/python3.6/site-packages/connexion/apis/__init__.py", line 1, in <module>
    from .abstract import AbstractAPI  # NOQA
  File "/home/agalindodev/tmp/python-flask-server/venv/lib/python3.6/site-packages/connexion/apis/abstract.py", line 14, in <module>
    from ..operation import Operation
  File "/home/agalindodev/tmp/python-flask-server/venv/lib/python3.6/site-packages/connexion/operation.py", line 7, in <module>
    from .decorators import validation
  File "/home/agalindodev/tmp/python-flask-server/venv/lib/python3.6/site-packages/connexion/decorators/validation.py", line 9, in <module>
    from werkzeug import FileStorage
ImportError: cannot import name 'FileStorage'

and modifing requirements.txt moving from connexion==1.1.15 to connexion==2.6.0 it launches but I finaly get:

TypeError: my_job_create() missing 1 required positional argument: 'my_session'

This is my environment:

1. OS and runtime:

python 3.6.9 on Ubuntu 18.04

2. requirements.txt

# connexion == 1.1.15
connexion == 2.4.0
python_dateutil == 2.6.0
setuptools >= 21.0.0

3. Complete swagger spec:

swagger: "2.0"
basePath: /api
info:
  title: "Just a swagger test API"
  version: "1.0.0"
paths:
  /my_jobs:
    post:
      operationId: my_job.create
      tags:
        - MyJob
      summary: "Create a job"
      consumes:
      - "application/json"
      produces:
      - "application/json"
      parameters:
        - name: "my_session"
          in: "header"
          description: "Session id that's creating the job"
          required: True
          type: string
      responses:
        "201":
          description: "Successfully created a job"
          schema:
            $ref: "#/definitions/MyJob"
definitions:
  MyJob:
    type: "object"
    properties:
      id:
        type: "string"

4. the error: Using the modified requirements.txt I simply tried to POST a creation, passing the header but it generates an error:

$ curl -v -X POST --header 'Content-Type: application/json' --header 'Accept: application/problem+json' --header 'my_session: { "id": "xxxxx" }' 'http://0.0.0.0:8080/api/my_jobs'
*   Trying 0.0.0.0...
* TCP_NODELAY set
* Connected to 0.0.0.0 (127.0.0.1) port 8080 (#0)
> POST /api/my_jobs HTTP/1.1
> Host: 0.0.0.0:8080
> User-Agent: curl/7.58.0
> Content-Type: application/json
> Accept: application/problem+json
> my_session: { "id": "xxxxx" }
> 
* HTTP 1.0, assume close after body
< HTTP/1.0 500 INTERNAL SERVER ERROR
< Content-Type: application/problem+json
< Content-Length: 252
< Server: Werkzeug/0.12.2 Python/3.6.9
< Date: Sun, 02 Aug 2020 10:39:58 GMT
< 
{
  "detail": "The server encountered an internal error and was unable to complete your request.  Either the server is overloaded or there is an error in the application.",
  "status": 500,
  "title": "Internal Server Error",
  "type": "about:blank"
}
* Closing connection 0

the generated swagger server dumps this output:

[2020-07-31 14:08:50,078] ERROR in app: Exception on /api/my_jobs [POST]
Traceback (most recent call last):
  File "/.../python-flask-server/venv/lib/python3.6/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/.../python-flask-server/venv/lib/python3.6/site-packages/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/.../python-flask-server/venv/lib/python3.6/site-packages/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/.../python-flask-server/venv/lib/python3.6/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/.../python-flask-server/venv/lib/python3.6/site-packages/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "/.../python-flask-server/venv/lib/python3.6/site-packages/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/.../python-flask-server/venv/lib/python3.6/site-packages/connexion/decorators/decorator.py", line 48, in wrapper
    response = function(request)
  File "/.../python-flask-server/venv/lib/python3.6/site-packages/connexion/decorators/uri_parsing.py", line 173, in wrapper
    response = function(request)
  File "/.../python-flask-server/venv/lib/python3.6/site-packages/connexion/decorators/validation.py", line 388, in wrapper
    return function(request)
  File "/.../python-flask-server/venv/lib/python3.6/site-packages/connexion/decorators/parameter.py", line 126, in wrapper
    return function(**kwargs)
TypeError: my_job_create() missing 1 required positional argument: 'my_session'
127.0.0.1 - - [31/Jul/2020 14:08:50] "POST /api/my_jobs HTTP/1.1" 500 -

How can I make it work?

Many thanks!!!

Angel
  • 940
  • 1
  • 9
  • 21
  • Does this help? https://connexion.readthedocs.io/en/latest/request.html#header-parameters and https://github.com/zalando/connexion/issues/850 – Helen Jul 31 '20 at 17:20
  • Thans, Helen. I think that my problem is really a newbie problem regarding the swagger server generated by Swagger Editor. The requirements.txt doesn't work for me. Once moving to newer version of Connexion it starts up, but then it fails managing headers. It would be great for you to post a working requirements.txt . Thanks in advance! – Angel Aug 02 '20 at 11:00

1 Answers1

0

Header parameters are not passed to the handler functions as parameters https://connexion.readthedocs.io/en/latest/request.html#header-parameters.

You cant use

  parameters:
  - name: "my_session"
    in: "header"
    description: "Session id that's creating the job"
    required: True
    type: string

You must use connexion.request.headers['my_session']

Kevin Martins
  • 590
  • 7
  • 20
  • Thanks for your response, Kevin, but it matches with my explanation in the question and it doesn't work in my environment. I'll edit the question to be more concise, giving versions of libs and the full swagger definition. Please, could you provide the requirements.txt that works for you? The swagger server generated by Swagger Editor doesn't work for me and I had to change the requirements, may be this is the problem. Thanks in advance! – Angel Aug 02 '20 at 10:33