Added defaultResponseFactory mechanism to WebApiController
ln.build - build0.waldrennach.l--n.de build job pending Details

master
Harald Wolff 2020-12-08 09:14:26 +01:00
parent 4cf75a223d
commit 832bceacb5
1 changed files with 32 additions and 5 deletions

View File

@ -40,7 +40,9 @@ namespace ln.http.api
HttpResponse MapRequest(HttpRequest request, MethodInfo methodInfo)
{
MapArguments(request, methodInfo, out object[] arguments);
Func<HttpResponse> defaultResponseFactory;
MapArguments(request, methodInfo, out object[] arguments, out defaultResponseFactory);
object result = methodInfo.Invoke(this, arguments);
@ -53,13 +55,13 @@ namespace ln.http.api
result = json;
}
return HttpResponse.OK().Content((JSONValue)result);
return defaultResponseFactory().Content((JSONValue)result);
}
return HttpResponse.OK().Content(result.ToString());
return defaultResponseFactory().Content(result.ToString());
}
void MapArguments(HttpRequest request, MethodInfo methodInfo,out object[] arguments)
void MapArguments(HttpRequest request, MethodInfo methodInfo,out object[] arguments, out Func<HttpResponse> defaultRepsonseFactory)
{
ParameterInfo[] parameterInfos = methodInfo.GetParameters();
arguments = new object[parameterInfos.Length];
@ -95,7 +97,6 @@ namespace ln.http.api
throw new BadRequestException();
} else if (Cast.To(value, parameterInfo.ParameterType, out arguments[n]))
{
} else if (value is string text)
{
arguments[n] = TypeDescriptor.GetConverter(parameterInfo.ParameterType).ConvertFromInvariantString(text);
@ -108,6 +109,32 @@ namespace ln.http.api
}
}
}
switch (request.HttpMethod)
{
case HttpMethod.GET:
if (typeof(void).Equals(methodInfo.ReturnType))
defaultRepsonseFactory = HttpResponse.NoContent;
else
defaultRepsonseFactory = HttpResponse.OK;
break;
case HttpMethod.POST:
defaultRepsonseFactory = HttpResponse.Created;
break;
case HttpMethod.PUT:
defaultRepsonseFactory = HttpResponse.OK;
break;
case HttpMethod.PATCH:
defaultRepsonseFactory = HttpResponse.OK;
break;
case HttpMethod.DELETE:
defaultRepsonseFactory = HttpResponse.NoContent;
break;
default:
defaultRepsonseFactory = HttpResponse.OK;
break;
}
}
bool FindArgumentByName(ArgumentSourceAttribute sourceAttribute, HttpRequest request, JSONValue jsonContent, string parameterName, out object value)