/// <summary> /// 创建ApiTaskOf(T)的实例 /// </summary> /// <param name="httpApiConfig">http接口配置</param> /// <param name="apiActionDescriptor">api描述</param> /// <returns></returns> public static ApiTask CreateInstance(HttpApiConfig httpApiConfig, ApiActionDescriptor apiActionDescriptor) { // var instance = new ApiTask<TResult>(httpApiConfig, apiActionDescriptor); var ctor = apiActionDescriptor.Return.ITaskCtor; return(ctor.Invoke(new object[] { httpApiConfig, apiActionDescriptor }) as ApiTask); }
public async Task BeforeRequestAsyncTest() { var apiAction = new ApiActionDescriptor(typeof(IMyApi).GetMethod("PostAsync")); var context = new TestRequestContext(apiAction, new { name = "laojiu", birthDay = DateTime.Parse("2010-10-10") }); context.HttpContext.RequestMessage.RequestUri = new Uri("http://www.webapi.com/"); context.HttpContext.RequestMessage.Method = HttpMethod.Post; var attr = new JsonContentAttribute(); await attr.OnRequestAsync(new ApiParameterContext(context, 0)); var body = await context.HttpContext.RequestMessage.Content.ReadAsByteArrayAsync(); var options = context.HttpContext.HttpApiOptions.JsonSerializeOptions; using var buffer = new BufferWriter <byte>(); context.HttpContext.ServiceProvider.GetService <IJsonSerializer>().Serialize(buffer, context.Arguments[0], options); var target = buffer.GetWrittenSpan().ToArray(); Assert.True(body.SequenceEqual(target)); }
public async Task OnRequestAsync_Parameter_Timespan_Test() { var apiAction = new ApiActionDescriptor(typeof(ITestApi).GetMethod("PostAsync")); var context = new TestRequestContext(apiAction, 5); var attr = new TimeoutAttribute(); var parameterContext = new ApiParameterContext(context, 0); await attr.OnRequestAsync(parameterContext, () => Task.CompletedTask); await Task.Delay(20); var canceled = context.CancellationTokens[0].IsCancellationRequested; Assert.True(canceled); context.Arguments[0] = Guid.NewGuid(); await Assert.ThrowsAsync <HttpApiInvalidOperationException>(() => attr.OnRequestAsync(parameterContext, () => Task.CompletedTask)); context.Arguments[0] = null; await attr.OnRequestAsync(parameterContext, () => Task.CompletedTask); Assert.True(context.CancellationTokens.Count == 1); }
/// <summary> /// 创建DefaultApiActionInvoker类型或其子类型的实例 /// </summary> /// <param name="actionDescriptor">Action描述</param> /// <returns></returns> protected virtual ApiActionInvoker CreateDefaultActionInvoker(ApiActionDescriptor actionDescriptor) { var resultType = actionDescriptor.Return.DataType.Type; var invokerType = typeof(DefaultApiActionInvoker <>).MakeGenericType(resultType); return(invokerType.CreateInstance <ApiActionInvoker>(actionDescriptor)); }
public async Task OnRequestAsyncRelativeTest() { var apiAction = new ApiActionDescriptor(typeof(IMyApi).GetMethod("PostAsync")); var context = new TestRequestContext(apiAction, "http://www.baidu.com"); var attr = new UriAttribute(); await attr.OnRequestAsync(new ApiParameterContext(context, 0)); Assert.True(context.HttpContext.RequestMessage.RequestUri == new Uri("http://www.baidu.com")); context.Arguments[0] = "/login"; await attr.OnRequestAsync(new ApiParameterContext(context, 0)); Assert.True(context.HttpContext.RequestMessage.RequestUri == new Uri("http://www.baidu.com/login")); context.Arguments[0] = "/login/login2"; await attr.OnRequestAsync(new ApiParameterContext(context, 0)); Assert.True(context.HttpContext.RequestMessage.RequestUri == new Uri("http://www.baidu.com/login/login2")); context.Arguments[0] = "login3"; await attr.OnRequestAsync(new ApiParameterContext(context, 0)); Assert.True(context.HttpContext.RequestMessage.RequestUri == new Uri("http://www.baidu.com/login/login3")); }
/// <summary> /// 生成ApiActionDescriptor /// </summary> /// <param name="method">拦截方法</param> /// <returns></returns> private static ApiActionDescriptor GetActionDescriptor(MethodInfo method) { var descriptor = new ApiActionDescriptor { Name = method.Name, ReturnTaskType = method.ReturnType, ReturnDataType = method.ReturnType.IsGenericType && method.ReturnType.GetGenericTypeDefinition().IsAssignableFrom(typeof(Task <>)) ? method.ReturnType.GetGenericArguments().FirstOrDefault() : method.ReturnType, Attributes = method.GetCustomAttributes <ApiActionAttribute>(true).ToArray(), Parameters = method.GetParameters().Select((param, index) => GetParameterDescriptor(param, index, method)).ToArray() }; if (!descriptor.Attributes.Any(x => x is HttpMethodAttribute)) { descriptor.Attributes = descriptor.Attributes.Concat(new[] { new HttpPostAttribute(Regex.Replace($"method/{method.DeclaringType.FullName}/{method.Name}/{string.Join("-", method.GetParameters().Select(x => x.ParameterType.FullName))}".ToLower(), "[^a-z|0-9]", "-")) }).ToArray(); } if (descriptor.Parameters.Count(x => x.Attributes.Any(o => o.GetType() != typeof(PathQueryAttribute))) > 1) { throw new NotSupportedException("不支持多个非值类型作为参数,请使用实体封装。"); } return(descriptor); }
public async Task OnRequestAsyncTest() { var apiAction = new ApiActionDescriptor(typeof(IMyApi).GetMethod("PostAsync")); var context = new TestRequestContext(apiAction, new { @class = 123, xx_yy = "xxyy" }); var attr = new HeadersAttribute(); context.HttpContext.RequestMessage.Headers.Clear(); await attr.OnRequestAsync(new ApiParameterContext(context, 0)); context.HttpContext.RequestMessage.Headers.TryGetValues("xx-yy", out IEnumerable <string> values); Assert.Equal("xxyy", values.FirstOrDefault()); context.HttpContext.RequestMessage.Headers.TryGetValues("class", out IEnumerable <string> cValues); Assert.Equal("123", cValues.FirstOrDefault()); attr.UnderlineToMinus = false; context.HttpContext.RequestMessage.Headers.Clear(); await attr.OnRequestAsync(new ApiParameterContext(context, 0)); context.HttpContext.RequestMessage.Headers.TryGetValues("xx_yy", out IEnumerable <string> values2); Assert.Equal("xxyy", values2.FirstOrDefault()); }
/// <summary> /// 请求Api的上下文 /// </summary> /// <param name="httpContext"></param> /// <param name="apiAction"></param> /// <param name="arguments"></param> /// <param name="properties"></param> protected ApiRequestContext(HttpContext httpContext, ApiActionDescriptor apiAction, object?[] arguments, DataCollection properties) { this.HttpContext = httpContext; this.ApiAction = apiAction; this.Arguments = arguments; this.Properties = properties; }
public async Task OnRequestAsyncTest() { var apiAction = new ApiActionDescriptor(typeof(ITestApi).GetMethod("PostAsync")); var context = new TestRequestContext(apiAction, string.Empty); context.HttpContext.RequestMessage.RequestUri = new Uri("http://www.webapi.com/"); context.HttpContext.RequestMessage.Method = HttpMethod.Post; var attr = new HttpPutAttribute(); await attr.OnRequestAsync(context); Assert.True(context.HttpContext.RequestMessage.Method == HttpMethod.Put); var attr2 = new HttpPutAttribute("/login"); await attr2.OnRequestAsync(context); Assert.True(context.HttpContext.RequestMessage.Method == HttpMethod.Put); Assert.True(context.HttpContext.RequestMessage.RequestUri == new Uri("http://www.webapi.com/login")); var attr3 = new HttpPutAttribute("http://www.baidu.com"); await attr3.OnRequestAsync(context); Assert.True(context.HttpContext.RequestMessage.Method == HttpMethod.Put); Assert.True(context.HttpContext.RequestMessage.RequestUri == new Uri("http://www.baidu.com")); }
public void InitTest() { var descriptor = new ApiActionDescriptor("http://api.dev/", typeof(IAubTestApi).GetMethod("PostAsync")); var attr1 = new HttpRoutePrefixAttribute("order-history"); attr1.Init(descriptor); Assert.True(descriptor.RoutePrefix == "order-history"); }
public void InitTest() { Assert.Throws <ArgumentNullException>(() => new ApiActionDescriptor(null, null)); var method = typeof(IAubTestApi).GetMethod("PostAsync"); var descriptor = new ApiActionDescriptor("http://api.dev/", method); Assert.NotNull(descriptor.Uri); }
public void NewTest() { var method = typeof(IAubTestApi).GetMethod("PostAsync"); var descriptor = new ApiActionDescriptor("http://api.dev/", method); Assert.True(descriptor.Attributes.Count == 3); Assert.True(descriptor.Name == method.Name); Assert.True(descriptor.Host == "http://api.dev/"); Assert.True(descriptor.Member == method); Assert.True(descriptor.Parameters.Count == 2); }
public async Task OnRequestAsync() { var apiAction = new ApiActionDescriptor(typeof(ITestApi).GetMethod("PostAsync")); var context = new TestRequestContext(apiAction, string.Empty); var attr = new HeaderAttribute("MyHeader", "laojiu"); await attr.OnRequestAsync(context); context.HttpContext.RequestMessage.Headers.TryGetValues("MyHeader", out IEnumerable <string> values); Assert.Equal("laojiu", values.First()); }
public void NewTest() { var m = typeof(IUserApi).GetMethod("Get1"); var d = new ApiActionDescriptor(m); Assert.True(d.Attributes.Count == 3); Assert.True(d.Filters.Count == 1); Assert.True(d.Parameters.Count == 2); Assert.True(d.Name == m.Name); Assert.True(d.Member == m); Assert.True(d.Return.ReturnType == m.ReturnType); }
public async Task OnRequestAsync() { var apiAction = new ApiActionDescriptor(typeof(ITestApi).GetMethod("PostAsync")); var context = new TestRequestContext(apiAction, "value"); var basicAuth = new BasicAuth("laojiu", "123456"); await basicAuth.OnRequestAsync(new ApiParameterContext(context, 0)); var auth = Convert.ToBase64String(Encoding.ASCII.GetBytes("laojiu:123456")); Assert.True(context.HttpContext.RequestMessage.Headers.Authorization.Parameter == auth); }
/// <summary> /// 创建Action执行器 /// </summary> /// <param name="actionDescriptor">Action描述</param> /// <returns></returns> public ApiActionInvoker CreateActionInvoker(ApiActionDescriptor actionDescriptor) { var actionInvoker = this.CreateDefaultActionInvoker(actionDescriptor); if (actionDescriptor.Return.ReturnType.IsInheritFrom <Task>() == false) { if (actionInvoker is IITaskReturnConvertable convertable) { actionInvoker = convertable.ToITaskReturnActionInvoker(); } } return(actionInvoker); }
public async Task OnRequestAsyncTest() { var apiAction = new ApiActionDescriptor(typeof(ITestApi).GetMethod("PostAsync")); var context = new TestRequestContext(apiAction, string.Empty); var attr = new BasicAuthAttribute("laojiu", "123456"); await attr.OnRequestAsync(context); var auth = Convert.ToBase64String(Encoding.ASCII.GetBytes("laojiu:123456")); Assert.True(context.HttpContext.RequestMessage.Headers.Authorization.Scheme == "Basic"); Assert.True(context.HttpContext.RequestMessage.Headers.Authorization.Parameter == auth); }
public void GetApiActionDescriptorTest() { var method = typeof(IMyApi).GetMethod("Login"); var descriptor1 = new ApiActionDescriptor(method); var descriptor2 = new ApiActionDescriptor(method); Assert.False(object.ReferenceEquals(descriptor1, descriptor2)); Assert.True(descriptor1.Name == "Login"); Assert.True(descriptor1.Parameters.Count == 1); Assert.True(descriptor1.Filters.Count == 0); Assert.True(descriptor1.Attributes.Count == 0); }
/// <summary> /// 生成ApiActionDescriptor /// </summary> /// <param name="invocation">拦截内容</param> /// <returns></returns> private static ApiActionDescriptor GetActionDescriptor(MethodInfo method) { var descriptor = new ApiActionDescriptor { Name = $"{method.DeclaringType.Name}.{method.Name}", ReturnTaskType = method.ReturnType, ReturnDataType = method.ReturnType.IsGenericType ? method.ReturnType.GetGenericArguments().FirstOrDefault() : method.ReturnType, Attributes = method.GetCustomAttributes <ApiActionAttribute>(true).ToArray(), Parameters = method.GetParameters().Select(GetParameterDescriptor).ToArray() }; return(descriptor); }
public async Task StringResultTest() { var apiAction = new ApiActionDescriptor(typeof(ITestApi).GetMethod("StringAsync")); var context = new TestRequestContext(apiAction, "laojiu"); var responseContext = new ApiResponseContext(context); context.HttpContext.RequestMessage.Method = HttpMethod.Post; context.HttpContext.ResponseMessage.Content = new StringContent("laojiu", Encoding.UTF8); var attr = new RawReturnAttribute(); await attr.OnResponseAsync(responseContext); Assert.True(responseContext.Result?.ToString() == "laojiu"); }
public async Task OnRequestAsync() { var apiAction = new ApiActionDescriptor(typeof(ITestApi).GetMethod("PostAsync")); var context = new TestRequestContext(apiAction, string.Empty); context.HttpContext.RequestMessage.Method = HttpMethod.Post; var attr = new FormDataTextAttribute("value", "laojiu"); await attr.OnRequestAsync(context); var body = await context.HttpContext.RequestMessage.Content.ReadAsStringAsync(); Assert.Contains(get("value", "laojiu"), body); }
public async Task OnRequestAsyncTest() { var apiAction = new ApiActionDescriptor(typeof(ITestApi).GetMethod("PostAsync")); var context = new TestRequestContext(apiAction, string.Empty); Assert.Throws <ArgumentNullException>(() => new HttpHostAttribute(null)); Assert.Throws <UriFormatException>(() => new HttpHostAttribute("/")); context.HttpContext.RequestMessage.RequestUri = null; var attr = new HttpHostAttribute("http://www.webapiclient.com"); await attr.OnRequestAsync(context); Assert.True(context.HttpContext.RequestMessage.RequestUri == new Uri("http://www.webapiclient.com")); }
public async Task OnRequestAsync() { var apiAction = new ApiActionDescriptor(typeof(ITestApi).GetMethod("PostAsync")); var context = new TestRequestContext(apiAction, 10); var attr = new TimeoutAttribute(50); await attr.OnRequestAsync(context); await Task.Delay(100); var canceled = context.CancellationTokens[0].IsCancellationRequested; Assert.True(canceled); }
public void CloneTest() { var m = typeof(IUserApi).GetMethod("Get1"); var d = new ApiActionDescriptor(m); var d2 = d.Clone(new object[] { null, null }); Assert.True(d.Attributes == d2.Attributes); Assert.True(d.Name == d2.Name); Assert.True(d.Filters == d2.Filters); Assert.True(d.Member == d2.Member); Assert.True(d.Parameters != d2.Parameters); Assert.True(d.Parameters.Count == d2.Parameters.Count); Assert.True(d.Return == d2.Return); }
/// <summary> /// 生成ApiActionDescriptor /// </summary> /// <param name="invocation">拦截内容</param> /// <returns></returns> private static ApiActionDescriptor GetActionDescriptor(AspectContext invocation) { var method = invocation.ServiceMethod; var descriptor = new ApiActionDescriptor { Name = method.Name, ReturnTaskType = method.ReturnType, ReturnDataType = method.ReturnType.IsGenericType ? method.ReturnType.GetGenericArguments().FirstOrDefault() : method.ReturnType, Attributes = method.GetCustomAttributes <ApiActionAttribute>(true).ToArray(), Parameters = method.GetParameters().Select(GetParameterDescriptor).ToArray() }; return(descriptor); }
public async Task OnRequestAsyncTest() { var apiAction = new ApiActionDescriptor(typeof(IMyApi).GetMethod("PostAsync")); var context = new TestRequestContext(apiAction, new StringContent("laojiu")); context.HttpContext.RequestMessage.RequestUri = new Uri("http://www.mywebapi.com"); context.HttpContext.RequestMessage.Method = HttpMethod.Post; var attr = new HttpContentTypeAttribute(); await attr.OnRequestAsync(new ApiParameterContext(context, 0)); var body = await context.HttpContext.RequestMessage.Content.ReadAsStringAsync(); Assert.True(body == "laojiu"); }
public async Task OnRequestAsync() { var apiAction = new ApiActionDescriptor(typeof(ITestApi).GetMethod("PostAsync")); var context = new TestRequestContext(apiAction, "value"); context.HttpContext.RequestMessage.RequestUri = new Uri("http://www.webapi.com/"); context.HttpContext.RequestMessage.Method = HttpMethod.Post; IApiParameter formField = new FormField("laojiu"); await formField.OnRequestAsync(new ApiParameterContext(context, 0)); var body = await context.HttpContext.RequestMessage.Content.ReadAsStringAsync(); Assert.Equal("value=laojiu", body); }
public void InitTest() { var descriptor = new ApiActionDescriptor("http://api.dev/", typeof(IAubTestApi).GetMethod("PostAsync")); var attr1 = new HttpHostAttribute("http://api.test.cc/"); attr1.Init(descriptor); Assert.True(descriptor.Host == "http://api.dev/"); descriptor.Host = null; var attr2 = new HttpHostAttribute("http://api.test.cc/"); attr2.Init(descriptor); Assert.True(descriptor.Host == "http://api.test.cc/"); }
public async Task OnRequestAsync_Parameter() { var apiAction = new ApiActionDescriptor(typeof(ITestApi).GetMethod("PostAsync")); var context = new TestRequestContext(apiAction, "laojiu"); context.HttpContext.RequestMessage.Method = HttpMethod.Post; var parameterContext = new ApiParameterContext(context, 0); var attr = new FormFieldAttribute(); await attr.OnRequestAsync(parameterContext); var body = await context.HttpContext.RequestMessage.Content.ReadAsStringAsync(); Assert.Equal("value=laojiu", body); }
public async Task OnRequestAsync_Parameter_Double_Test() { var apiAction = new ApiActionDescriptor(typeof(ITestApi).GetMethod("PostAsync")); var context = new TestRequestContext(apiAction, 1); var attr = new TimeoutAttribute(); var parameterContext = new ApiParameterContext(context, 0); await attr.OnRequestAsync(parameterContext, () => Task.CompletedTask); await Task.Delay(20); var canceled = context.CancellationTokens[0].IsCancellationRequested; Assert.True(canceled); }
public SchemaCollection Get() { //var collection = Configuration.Properties.GetOrAdd("postmanCollection", k => // { var requestUri = Request.Url; string baseUri = requestUri.Scheme + "://" + requestUri.Host + ":" + requestUri.Port + HttpContext.Request.ApplicationPath; var postManCollection = new SchemaCollection(); postManCollection.id = Guid.NewGuid(); postManCollection.name = "Exposed Endpoints"; // TODO: Make configurable. postManCollection.timestamp = DateTime.Now.Ticks; postManCollection.requests = new Collection<SchemaRequest>(); var actionDescriptors = new ApiActionDescriptor[0]; //Configuration.Services.GetApiExplorer().ApiDescriptions; foreach (var apiDescription in actionDescriptors) { var request = new SchemaRequest { collectionId = postManCollection.id, id = Guid.NewGuid(), method = Request.RequestContext.GetHttpMethod(), //url = baseUri.TrimEnd('/') + "/" + apiDescription.RelativePath, //description = apiDescription.Documentation, //name = apiDescription.RelativePath, data = "", headers = "", dataMode = "params", timestamp = 0 }; postManCollection.requests.Add(request); } //}) as SchemaCollection; Response.StatusCode = 200; //HtttpStatusCode.Ok Response.ContentType = "application/json"; return postManCollection; }
/// <summary> /// Gets the EDM model for the given type and request. /// </summary> /// <param name="elementClrType">The CLR type to retrieve a model for.</param> /// <param name="request">The request message to retrieve a model for.</param> /// <param name="actionDescriptor">The action descriptor for the action being queried on.</param> /// <returns>The EDM model for the given type and request.</returns> /// <remarks> /// Override this method to customize the EDM model used for querying. /// </remarks> public virtual IEdmModel GetModel(Type elementClrType, HttpRequestMessage request, ApiActionDescriptor actionDescriptor) { // Get model for the request IEdmModel model = request.GetEdmModel(); if (model == null || model.GetEdmType(elementClrType) == null) { // user has not configured anything or has registered a model without the element type // let's create one just for this type and cache it in the action descriptor model = actionDescriptor.GetEdmModel(elementClrType); } Contract.Assert(model != null); return model; }
protected virtual IEnumerable<Filter> GetQueryableFilters(ControllerContext controllerContext, ApiActionDescriptor actionDescriptor) { yield return new Filter(new QueryFilterAttribute(this.Validator) { ResultLimit = 10, InlineCount = true }, FilterScope.Last, null); yield return new Filter(new QueryOfTypeFilterAttribute(), FilterScope.Last, null); }