コード例 #1
0
        public void TimeoutTest()
        {
            var request = new HttpApiRequestMessage()
            {
                Timeout = TimeSpan.FromDays(1d)
            };

            Assert.True(request.Timeout == TimeSpan.FromDays(1d));
        }
コード例 #2
0
        /// <summary>
        /// 读取请求内容
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        private async Task <string?> ReadRequestContentAsync(HttpApiRequestMessage request)
        {
            if (request.Content == null)
            {
                return(null);
            }

            return(request.Content is ICustomHttpContentConvertable convertable
                ? await convertable.ToCustomHttpContext().ReadAsStringAsync().ConfigureAwait(false)
                : await request.Content.ReadAsStringAsync().ConfigureAwait(false));
        }
コード例 #3
0
        public void SetCookieTest()
        {
            var cookie  = "a=1; b=2";
            var reqeust = new HttpApiRequestMessage();

            reqeust.SetCookie(cookie);
            reqeust.Headers.TryGetValues("Cookie", out IEnumerable <string> values);
            var cookies = values.ToArray();

            Assert.True(cookies.Length == 1 && cookies.First() == "a=1; b=2");
        }
コード例 #4
0
        public void ReplaceHttpHostTest()
        {
            var request = new HttpApiRequestMessage();

            Assert.Throws <ApiInvalidConfigException>(() => request.ReplaceHttpHost(new Uri("/", UriKind.Relative)));

            request.RequestUri = new Uri("http://webapiclient.com/a/b");
            request.ReplaceHttpHost(new Uri("https://a.com"));

            Assert.Equal(request.RequestUri, new Uri("https://a.com/a/b"));
        }
コード例 #5
0
        public override async Task OnRequestAsync(ApiRequestContext context)
        {
            await Task.CompletedTask;
            IServiceProvider sp           = context.HttpContext.ServiceProvider;
            HostProvider     hostProvider = sp.GetRequiredService <HostProvider>();
            //服务名也可以在接口配置时挂在Properties中
            string host = hostProvider.ResolveService(this.Name);
            HttpApiRequestMessage requestMessage = context.HttpContext.RequestMessage;

            //和原有的Uri组合并覆盖原有Uri
            //并非一定要这样实现,只要覆盖了RequestUri,即完成了替换
            requestMessage.RequestUri = requestMessage.MakeRequestUri(new Uri(host));
        }
コード例 #6
0
        public void MakeRequestUriTest()
        {
            var request = new HttpApiRequestMessage();
            var uri     = request.MakeRequestUri(new Uri("a", UriKind.RelativeOrAbsolute));

            Assert.Equal("a", uri.OriginalString);

            request = new HttpApiRequestMessage();
            uri     = request.MakeRequestUri(new Uri("http://a.com", UriKind.RelativeOrAbsolute));
            Assert.Equal("http://a.com", uri.OriginalString);

            request = new HttpApiRequestMessage();
            uri     = request.MakeRequestUri(new Uri("http://a.com/a", UriKind.RelativeOrAbsolute));
            Assert.Equal("http://a.com/a", uri.OriginalString);
        }
コード例 #7
0
        public async Task AddFormFiledAsyncTest()
        {
            var reqeust = new HttpApiRequestMessage();
            await Assert.ThrowsAsync <NotSupportedException>(() => reqeust.AddFormFieldAsync("name", "value"));

            reqeust.Method     = System.Net.Http.HttpMethod.Post;
            reqeust.RequestUri = new Uri("http://webapiclient.com");
            await reqeust.AddFormFieldAsync("name", "laojiu");

            await reqeust.AddFormFieldAsync(new[] { new KeyValue("age", "18") });

            var body = await reqeust.Content.ReadAsStringAsync();

            Assert.Equal("name=laojiu&age=18", body);
            Assert.True(reqeust.Content.Headers.ContentType.MediaType == "application/x-www-form-urlencoded");
        }
コード例 #8
0
        public override Task OnRequestAsync(ApiRequestContext context)
        {
            var options = context.HttpContext.HttpApiOptions;

            //获取注册时为服务配置的服务名
            options.Properties.TryGetValue("serviceName", out object serviceNameObj);
            string                serviceName    = serviceNameObj as string;
            IServiceProvider      sp             = context.HttpContext.ServiceProvider;
            HostProvider          hostProvider   = sp.GetRequiredService <HostProvider>();
            string                host           = hostProvider.ResolveService(serviceName);
            HttpApiRequestMessage requestMessage = context.HttpContext.RequestMessage;

            //和原有的Uri组合并覆盖原有Uri
            //并非一定要这样实现,只要覆盖了RequestUri,即完成了替换
            requestMessage.RequestUri = requestMessage.MakeRequestUri(new Uri(host));
            return(Task.CompletedTask);
        }
コード例 #9
0
        /// <summary>
        /// 异步发送请求
        /// </summary>
        /// <param name="request">请求消息</param>
        /// <returns></returns>
        public async Task <HttpResponseMessage> SendAsync(HttpApiRequestMessage request)
        {
            if (request.RequestUri == null)
            {
                throw new HttpApiConfigException("未配置RequestUri,RequestUri不能为null");
            }

            try
            {
                Interlocked.Increment(ref this.pendingCount);

                var timeout           = request.Timeout.HasValue ? request.Timeout.Value : this.Timeout;
                var cancellationToken = new CancellationTokenSource(timeout).Token;
                return(await this.client.SendAsync(request, cancellationToken));
            }
            finally
            {
                Interlocked.Decrement(ref this.pendingCount);
            }
        }
コード例 #10
0
        public void AddUrlQueryTest()
        {
            var request = new HttpApiRequestMessage();

            Assert.Throws <ApiInvalidConfigException>(() => request.AddUrlQuery("xKey", "xValue"));

            request.RequestUri = new Uri("http://webapiclient.com/");
            request.AddUrlQuery("xKey", "xValue");
            Assert.True(request.RequestUri == new Uri("http://webapiclient.com?xKey=xValue"));

            Assert.Throws <ArgumentNullException>(() => request.AddUrlQuery(null, string.Empty));

            request.AddUrlQuery("yKey", "yValue");
            Assert.True(request.RequestUri == new Uri("http://webapiclient.com?xKey=xValue&yKey=yValue"));

            var unicodeValue = Uri.EscapeDataString("老九");

            request.AddUrlQuery("zKey", "老九");
            var url = new Uri($"http://webapiclient.com?xKey=xValue&yKey=yValue&zKey={unicodeValue}");

            Assert.True(request.RequestUri == url);
        }
コード例 #11
0
        public async Task AddFormDataTextTest()
        {
            string get(string name, string value)
            {
                return($@"Content-Disposition: form-data; name=""{name}""

{HttpUtility.UrlEncode(value, Encoding.UTF8)}");
            }

            var reqeust = new HttpApiRequestMessage();

            reqeust.Method     = System.Net.Http.HttpMethod.Post;
            reqeust.RequestUri = new Uri("http://webapiclient.com");
            reqeust.AddFormDataText("name", "laojiu");
            reqeust.AddFormDataText(new[] { new KeyValue("age", "18") });

            await Assert.ThrowsAsync <NotSupportedException>(() => reqeust.AddFormFieldAsync("key", "value"));

            var body = await reqeust.Content.ReadAsStringAsync();

            Assert.Contains(get("name", "laojiu"), body);
            Assert.Contains(get("age", "18"), body);
            Assert.True(reqeust.Content.Headers.ContentType.MediaType == "multipart/form-data");
        }
コード例 #12
0
        public void AddUrlQueryTest()
        {
            var request = new HttpApiRequestMessage();

            Assert.Throws <HttpApiInvalidOperationException>(() => request.AddUrlQuery("xKey", "xValue"));

            request.RequestUri = new Uri("http://webapiclient.com/");
            request.AddUrlQuery("xKey", "xValue");
            Assert.True(request.RequestUri == new Uri("http://webapiclient.com?xKey=xValue"));

            Assert.Throws <ArgumentNullException>(() => request.AddUrlQuery(null, string.Empty));

            var kv = new KeyValue("yKey", "yValue");

            request.AddUrlQuery(kv);
            Assert.True(request.RequestUri == new Uri("http://webapiclient.com?xKey=xValue&yKey=yValue"));

            var unicodeValue = HttpUtility.UrlEncode("老九", Encoding.UTF8);

            request.AddUrlQuery(new[] { new KeyValue("zKey", "老九") }, Encoding.UTF8);
            var url = new Uri($"http://webapiclient.com?xKey=xValue&yKey=yValue&zKey={unicodeValue}");

            Assert.True(request.RequestUri == url);
        }