示例#1
0
        internal static void ResolveOperations(this SwaggerService swaggerService, ref SwaggerOperations swaggerOperations, ref SwaggerParserContext context)
        {
            if (swaggerOperations.Ref != null)
            {
                const string refPrefix = "#/paths/";
                if (!swaggerOperations.Ref.StartsWith(refPrefix, StringComparison.Ordinal))
                {
                    throw new ServiceDefinitionException("Operations $ref must start with '#/paths/'.", context.CreatePosition());
                }

                string name = UnescapeRefPart(swaggerOperations.Ref.Substring(refPrefix.Length));
                if (!swaggerService.Paths.TryGetValue(name, out swaggerOperations))
                {
                    throw new ServiceDefinitionException($"Missing path named '{name}'.", context.CreatePosition());
                }

                context = context.Root.CreateContext("paths/" + name);
            }
        }
示例#2
0
        private static void AddMethodToPaths(IDictionary <string, SwaggerOperations> paths, ServiceInfo service, HttpMethodInfo httpMethodInfo)
        {
            var methodInfo = httpMethodInfo.ServiceMethod;

            SwaggerOperations operations;

            if (!paths.TryGetValue(httpMethodInfo.Path, out operations))
            {
                paths[httpMethodInfo.Path] = operations = new SwaggerOperations();
            }

            var operation = new SwaggerOperation
            {
                Summary     = GetSummaryOrNull(methodInfo),
                Description = GetRemarksOrNull(methodInfo),
                OperationId = methodInfo.Name,
                Deprecated  = GetObsoleteOrNull(methodInfo),
            };

            if (httpMethodInfo.RequestNormalFields.Count != 0 || httpMethodInfo.RequestBodyField != null)
            {
                operation.Consumes = new[] { "application/json" }
            }
            ;
            if (httpMethodInfo.ValidResponses.Any(x => (x.NormalFields != null && x.NormalFields.Count != 0) || (x.BodyField != null && service.GetFieldType(x.BodyField.ServiceField).Kind != ServiceTypeKind.Boolean)))
            {
                operation.Produces = new[] { "application/json" }
            }
            ;

            var parameters = new List <SwaggerParameter>();

            foreach (var httpPathInfo in httpMethodInfo.PathFields)
            {
                parameters.Add(CreateSwaggerParameter(service, httpPathInfo.ServiceField, SwaggerParameterKind.Path, httpPathInfo.Name));
            }

            foreach (var httpQueryInfo in httpMethodInfo.QueryFields)
            {
                parameters.Add(CreateSwaggerParameter(service, httpQueryInfo.ServiceField, SwaggerParameterKind.Query, httpQueryInfo.Name));
            }

            foreach (var httpHeaderInfo in httpMethodInfo.RequestHeaderFields)
            {
                parameters.Add(CreateSwaggerParameter(service, httpHeaderInfo.ServiceField, SwaggerParameterKind.Header, httpHeaderInfo.Name));
            }

            var requestBodyFieldType = httpMethodInfo.RequestBodyField == null ? null : service.GetFieldType(httpMethodInfo.RequestBodyField.ServiceField);

            if (requestBodyFieldType != null && requestBodyFieldType.Kind != ServiceTypeKind.Boolean)
            {
                parameters.Add(CreateSwaggerRequestBodyParameter(requestBodyFieldType, "request", httpMethodInfo.RequestBodyField.ServiceField.Summary));
            }
            else if (httpMethodInfo.RequestNormalFields.Count != 0)
            {
                parameters.Add(CreateSwaggerRequestBodyParameter(TryCreateMethodRequestBodyType(httpMethodInfo), "request"));
            }

            if (parameters.Count != 0)
            {
                operation.Parameters = parameters;
            }

            var responses = new OurDictionary <string, SwaggerResponse>();

            foreach (var validResponse in httpMethodInfo.ValidResponses)
            {
                string statusCodeString = ((int)validResponse.StatusCode).ToString(CultureInfo.InvariantCulture);

                var bodyField     = validResponse.BodyField;
                var bodyFieldType = bodyField == null ? null : service.GetFieldType(bodyField.ServiceField);
                if (bodyField != null)
                {
                    responses[statusCodeString] = CreateSwaggerResponse(bodyFieldType, bodyField.ServiceField.Name, bodyField.ServiceField.Summary);
                }
                else if (validResponse.NormalFields != null && validResponse.NormalFields.Count != 0)
                {
                    responses[statusCodeString] = CreateSwaggerResponse(TryCreateMethodResponseBodyType(httpMethodInfo, validResponse));
                }
                else
                {
                    responses[statusCodeString] = CreateSwaggerResponse();
                }
            }

            operation.Responses = responses;

            string httpMethod = httpMethodInfo.Method.ToString().ToLowerInvariant();

            switch (httpMethod)
            {
            case "get":
                operations.Get = operation;
                break;

            case "post":
                operations.Post = operation;
                break;

            case "put":
                operations.Put = operation;
                break;

            case "delete":
                operations.Delete = operation;
                break;

            case "options":
                operations.Options = operation;
                break;

            case "head":
                operations.Head = operation;
                break;

            case "patch":
                operations.Patch = operation;
                break;

            default:
                throw new InvalidOperationException("Unexpected HTTP method: " + httpMethod);
            }
        }