diff --git a/coreapi/transports/http.py b/coreapi/transports/http.py index a548024..50077d5 100644 --- a/coreapi/transports/http.py +++ b/coreapi/transports/http.py @@ -99,9 +99,14 @@ def _get_params(method, encoding, fields, params=None): if params is None: return empty_params + # Collect path related variables + path = { + field.name: utils.validate_path_param(params[field.name]) + for field in fields if field.location == 'path' + } + fields = [field for field in fields if field.location != 'path'] field_map = {field.name: field for field in fields} - path = {} query = {} data = {} files = {} @@ -113,6 +118,10 @@ def _get_params(method, encoding, fields, params=None): seen_body = False for key, value in params.items(): + # Skip the value if we have it in the path only + if key in path.keys() and key not in field_map: + continue + if key not in field_map or not field_map[key].location: # Default is 'query' for 'GET' and 'DELETE', and 'form' for others. location = 'query' if method in ('GET', 'DELETE') else 'form' @@ -124,9 +133,7 @@ def _get_params(method, encoding, fields, params=None): location = 'body' try: - if location == 'path': - path[key] = utils.validate_path_param(value) - elif location == 'query': + if location == 'query': query[key] = utils.validate_query_param(value) elif location == 'body': data = utils.validate_body_param(value, encoding=encoding)