webclient调用webapi_webclient post webapi - CSDN
精华内容
参与话题
  • WebClient 调用api

    2019-07-30 23:42:02
    使用: /// <summary> /// 获取用户信息 /// </summary> /// <param name="code"></param> /// <param name="accessToken"></param> ...
    使用:
      /// <summary>
            /// 获取用户信息
            /// </summary>
            /// <param name="code"></param>
            /// <param name="accessToken"></param>
            /// <returns></returns>
            public static string GetUserInfo(string code, string accessToken)
            {
                string userid = "";
                string url = oApiHost + "/user/getuserinfo?access_token=" + accessToken + "&code=" + code;
                string result = Tool.HttpGet(url);
    
                dynamic data = JsonConvert.DeserializeObject<dynamic>(result);
    
    
                if (data.errcode == 0)
                {
                    userid = data.userid;
                }
                else
                {
                    throw new Exception("获取User Id发生错误,钉钉返回:" + Convert.ToString(data.errmsg));
                }
                return userid;
            }

     

    Tool类:

     public class Tool
        {
            public static string HttpGet(string url)
            {
                WebClient client = new WebClient();
                client.Headers.Add("Content-Type", "application/json");
                client.Encoding = Encoding.UTF8;
                string result = client.DownloadString(url);
                return result;
            }
    
            public static string HttpPost(string url, NameValueCollection data)
            {
                WebClient client = new WebClient();
                client.Headers.Add("Content-Type", "application/json");
                client.Encoding = Encoding.UTF8;
                byte[] origin_result = client.UploadValues(url, data);
                return Encoding.UTF8.GetString(origin_result);
            }
    }

     

     

    转载于:https://www.cnblogs.com/xuguanghui/p/6993625.html

    展开全文
  • Winform简单调用WebApi

    千次阅读 2019-01-08 08:21:39
    WebAPI Controllers public class SimuController : ApiController { //EF 5 BIM_GENERALDICTONARY_DBEntities entities=new BIM_GENERALDICTONARY_DBEntities(); ...

    WebAPI  Controllers

       public class SimuController : ApiController
        {     
            //EF 5
            BIM_GENERALDICTONARY_DBEntities entities=new BIM_GENERALDICTONARY_DBEntities(); 
            
            // GET api/Simu
            public IEnumerable<T_BIM_PropityClass> Get()
            {
                return entities.T_BIM_PropityClass;
            }
        }

    WinForm Client

         static readonly Uri _baseAddress = new Uri("http://localhost:5373/");
            static readonly Uri _address = new Uri(_baseAddress, "/api/simu");
            private void button1_Click(object sender, EventArgs e)
            {
    
                WebClient webClient = new WebClient();
                webClient.Headers["Accept"] = "application/json";
                webClient.Encoding = Encoding.UTF8;webClient.DownloadStringCompleted += (send, es) =>
                    {
                     if (es.Result != null)
                     {
                         var test = JsonConvert.DeserializeObject<T_BIM_PropityClass[]>(es.Result);
                         if (test.Any())
                         {
                             gridControl1.DataSource = test;}
                     }
                     else
                     {
                         MessageBox.Show(es.Error.Message);
                     }
                    };
                webClient.DownloadStringAsync(_address);
    
            }

     

    //将Json字符串转换为 对像   
    public static T Deserialize<T>(string json) { JavaScriptSerializer Serializer = new JavaScriptSerializer(); T objs = Serializer.Deserialize<T>(json); return objs; }

     

    展开全文
  • 本系列其他文章见:《响应式Spring的道法术器》。 前情提要:Spring WebFlux快速上手 | Spring WebFlux性能测试 本文源码 1.4.2 调用带有延迟的服务负载分析 ...我们的测试如下图所示,服务A调用服务B的API,...

    本系列其他文章见:《响应式Spring的道法术器》
    前情提要:Spring WebFlux快速上手 | Spring WebFlux性能测试
    本文源码

    1.4.2 调用带有延迟的服务负载分析

    由于微服务架构的盛行,大型系统内服务间基于HTTP API进行调用的会相当频繁。Netflix的系统有500+的微服务,感受一下~

    我们的测试如下图所示,服务A调用服务B的API,从服务A发出请求到接收到响应,期间可能存在延迟,比如网络不稳定、服务B不稳定,或因为所请求的API本身执行时间略长等等。对于作为HTTP客户端的服务A来说,是否能够异步地处理对服务B的请求与响应,也会带来明显的性能差异。我们通过简单的场景模拟一下:

    getImage?fileId=5a97c87cab644114e400174e

    通过上一个测试,我们已经确定WebFlux-with-latency的API /hello/{latency}能够在高并发下,仍然以稳定的latency~latency+5ms的延迟做出响应,因此用来作为被调用的服务B,模拟带有延迟的服务。这样如果测试结果出现明显的差异,那么可以排除服务B的原因。

    本次测试我们创建两个服务A的项目:restTemplate-as-callerwebClient-as-caller。它们也都提供URL为/hello/{latency}的API,在API的实现上都是通过Http请求服务A的/hello/{latency},返回的数据作为自己的响应。区别在于:restTemplate-as-caller使用RestTemplate作为Http客户端,webClient-as-caller使用WebClient作为Http客户端。

    1)restTemplate-as-caller

    使用Spring Initializr创建一个依赖“Web”的项目(也就是WebMVC项目),POM依赖:

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>

    端口号设置为8093,然后开发/hello/{latency}

    HelloController.java

        @RestController
        public class HelloController {
            private final String TARGET_HOST = "http://localhost:8092";
            private RestTemplate restTemplate;
    
            public HelloController() {  // 1
                PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
                connectionManager.setDefaultMaxPerRoute(1000);
                connectionManager.setMaxTotal(1000);
                this.restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory(
                        HttpClientBuilder.create().setConnectionManager(connectionManager).build()
                ));
    
            }
    
            @GetMapping("/hello/{latency}")
            public String hello(@PathVariable int latency) {
                return restTemplate.getForObject(TARGET_HOST + "/hello/" + latency, String.class);
            }
        }
    1. 由于测试过程中,RestTemplate会发出大量请求,我们在Controller的构造方法中创建一个基于Http连接池构造的RestTemplate,否则可能会把系统能给的端口用尽而出错;
    2. 使用RestTemplate请求服务B,并将响应返回。

    启动服务WebFlux-with-latencyrestTemplate-as-caller

    这个测试我们并不需要分析1000~10000的不同用户量场景下的响应时长的变化趋势,只是验证RestTemplate的阻塞性,所以直接测试一下6000用户,测试结果如下:

    吞吐量为1651req/sec,95%响应时长为1622ms。

    与1.4.1中mvc-with-latency的6000用户的结果类似,可见RestTemplate确实是会阻塞的。好吧,其实写个小@Test就能测出来是不是阻塞的,不过我的用意不仅限于此,下边我们进行一个响应式改造。首先请回忆前边介绍的两个内容:

    1. 不知道你是否还记得在1.3.3.1的最后提过,用Spring WebMVC + Reactor(spring-boot-starter-web+reactor-core)也可以像WebFlux一样实现基于注解的响应式编程;
    2. 在1.3.2.5介绍过如何利用elastic的调度器将阻塞的调用转化为异步非阻塞的。

    基于此,我们来改一下代码。首先在pom.xml中增加reactor-core

            <dependency>
                <groupId>io.projectreactor</groupId>
                <artifactId>reactor-core</artifactId>
                <version>3.1.4.RELEASE</version>
            </dependency>

    然后RestTemplate的调用转为异步:

        @GetMapping("/hello/{latency}")
        public Mono<String> hello(@PathVariable int latency) {
            return Mono.fromCallable(() -> restTemplate.getForObject(TARGET_HOST + "/hello/" + latency, String.class))
                    .subscribeOn(Schedulers.elastic());
        }

    再次测试,发现结果有了明显改善:

    吞吐量为2169 req/sec,95%响应时长为121ms。

    但是,使用Schedulers.elastic()其实就相当于将每一次阻塞的RestTemplate调用调度到不同的线程里去执行,效果如下:

    因为不仅有处理请求的200个线程,还有Schedulers.elastic()给分配的工作线程,所以总的线程数量飙到了1000多个!不过在生产环境中,我们通常不会直接使用弹性线程池,而是使用线程数量可控的线程池,RestTemplate用完所有的线程后,更多的请求依然会造成排队的情况。

    这一点使用Schedulers.newParallel()的调度器一测便知。

        @RestController
        public class HelloController {
            private final String TARGET_HOST = "http://localhost:8092";
            private RestTemplate restTemplate;
            private Scheduler fixedPool;
    
            public HelloController() {
                PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
                connectionManager.setDefaultMaxPerRoute(1000);
                connectionManager.setMaxTotal(1000);
                this.restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory(
                        HttpClientBuilder.create().setConnectionManager(connectionManager).build()
                ));
                fixedPool = Schedulers.newParallel("poolWithMaxSize", 400); // 1
            }
    
            @GetMapping("/hello/{latency}")
        //    public String hello(@PathVariable int latency) {
        //        return restTemplate.getForObject(TARGET_HOST + "/hello/" + latency, String.class);
        //    }
            public Mono<String> hello(@PathVariable int latency) {
                return Mono.fromCallable(() -> restTemplate.getForObject(TARGET_HOST + "/hello/" + latency, String.class))
                        .subscribeOn(fixedPool);    // 2
            }
        }
    1. 创建一个有最大400个线程的线程池poolWithMaxSize
    2. 调度到这个线程池上。

    测试时查看线程数:

    可见,最多有400个名为poolWithMaxSize的线程,RestTemplate就工作在这些线程上,相比请求处理线程多了一倍。看一下最终的测试结果:

    吞吐量2169req/sec,与弹性线程池的那次相同;95%响应时长为236ms,虽然达不到弹性线程池的效果,但是比完全同步阻塞的方式(RestTemplate在请求处理线程中执行)要好多了。

    我们再看看非阻塞的WebClient表现如何吧。

    2)webClient-as-caller

    webClient-as-caller基于WebFlux的依赖,端口号8094,不多说,直接看Controller:

        @RestController
        public class HelloController {
            private final String TARGET_HOST = "http://localhost:8092";
            private WebClient webClient;
    
            public HelloController() {
                this.webClient = WebClient.builder().baseUrl(TARGET_HOST).build();
            }
    
            @GetMapping("/hello/{latency}")
            public Mono<String> hello(@PathVariable int latency) {
                return webClient
                        .get().uri("/hello/" + latency)
                        .exchange()
                        .flatMap(clientResponse -> clientResponse.bodyToMono(String.class));
            }

    跑一下6000用户的测试:

    吞吐量2195 req/sec,95%响应时长109ms。

    关键的是,WebClient不需要大量并发的线程就可以漂亮地搞定这件事儿了:

    3)总结

    WebClient同样能够以少量而固定的线程数处理高并发的Http请求,在基于Http的服务间通信方面,可以取代RestTemplate以及AsyncRestTemplate。

    异步非阻塞的Http客户端,请认准——WebClient~

    下一节,介绍一下微服务先行者、全球最大的视频服务平台Netflix使用异步的Http客户端来改造其微服务网关的案例。

    展开全文
  • springboot2.0 webClient api 调用

    千次阅读 2018-03-31 10:41:00
    import java.util.Map; import org.springframework.http.HttpMethod; import org.springframework.... import org.springframework.util.CollectionUtils; import org.springframework.web.reactiv...

    import java.util.Map;

    import org.springframework.http.HttpMethod;
    import org.springframework.http.MediaType;
    import org.springframework.util.CollectionUtils;
    import org.springframework.web.reactive.function.client.WebClient;
    import org.springframework.web.reactive.function.client.WebClient.RequestBodySpec;
    import reactor.core.publisher.Mono;

    /**
    * @Description:
    * @author lukew
    * @email 13507615840@163.com
    * @date 2018年3月31日 上午9:25:47
    */
    public class WebClientUtil {

    private static final MediaType MEDIATYPE = MediaType.APPLICATION_JSON_UTF8;
    
    /**
     * 
     * @param paramter
     *            请求参数
     * @param url
     *            请求路径
     * @param resultType
     *            返回结果类型
     * @return
     */
    public static <V> V post(Object paramter, String url, Class<V> resultType) {
    
        return post(uri(url, HttpMethod.POST), paramter, resultType);
    }
    
    /**
     * 
     * @param paramter
     *            请求参数
     * @param url
     *            请求路径
     * @param header
     *            请求头
     * @param resultType
     *            返回结果类型
     * @return
     */
    public static <V> V post(Object paramter, String url, Map<String, String> header, Class<V> resultType) {
    
        RequestBodySpec uri = uri(url, HttpMethod.POST);
        addHeader(header, uri);
        return post(uri, paramter, resultType);
    }
    
    private static <V> V post(RequestBodySpec uri, Object paramter, Class<V> resultType) {
    
        return uri.contentType(MEDIATYPE).body(Mono.just(paramter), Object.class).retrieve().bodyToMono(resultType)
                .block();
    }
    
    /**
     * 
     * @param url
     *            请求路径
     * @param resultType
     *            返回结果类型
     * @return
     */
    public static <V> V get(String url, Class<V> resultType) {
    
        return uri(url, HttpMethod.GET).retrieve().bodyToMono(resultType).block();
    }
    
    /**
     * 
     * @param url
     *            请求路径
     * @param header
     *            请求头
     * @param resultType
     *            返回结果类型
     * @return
     */
    public static <V> V get(String url, Map<String, String> header, Class<V> resultType) {
    
        RequestBodySpec uri = uri(url, HttpMethod.GET);
        addHeader(header, uri);
        return uri.retrieve().bodyToMono(resultType).block();
    }
    
    private static RequestBodySpec uri(String url, HttpMethod method) {
    
        return WebClient.create().method(method).uri(url);
    }
    
    private static void addHeader(Map<String, String> header, RequestBodySpec uri) {
    
        if (!CollectionUtils.isEmpty(header)) {
            header.forEach((name, value) -> uri.cookie(name, value));
        }
    }
    

    }

    展开全文
  • ASP.NET for WebApi

    千次阅读 2019-07-15 19:15:05
    WebApi,听说过吧?呵呵。感觉比WebService,WCF要强。尤其是那个啥WCF,啥鬼东西,真难懂。真难搞。真难用。说比WebService要强,是因为不用在本地先生成个代理。而且XML也显得过于庞大。用ASP.NET 编写 WebApi 的...
  • WebClient, HttpClient, HttpWebRequest的比较

    千次阅读 2019-04-12 11:49:16
    最近因为要调用webAPI功能,所以开始对目前基于.NET的相关访问手段进行分析,主要有HttpWebRequest,WebClient和HttpClient三种手段。 HttpWebRequest 这是.NET创建者最初开发用于使用HTTP请求的标准类。使用...
  • C# 调用WebApi

    千次阅读 2018-05-14 13:51:00
    Post:private void button1_Click(object sender, EventArgs e) ...http://localhost:41558/api/Demo/PostXXX", "{Code:\"test089\",Name:\"test1\"}"); } ...
  • 这里用的是webflux,所以我们使用webClient来进行服务之间的调用,用的reactive的风格。 除了刚才的service-1,我们再复制一个client-1出来,搭建过程其实是一模一样的,只是记得要修改默认端口号,这里就不再多说...
  • c# Win Form程序调用Web API

    千次阅读 2017-08-16 22:57:59
    关于在winform中使用WebClient、HttpWebRequest、HttpClient调用webapi
  • Web Api 调用时出现405错误解决方案

    千次阅读 2019-07-08 16:37:43
    说明: .net core WebApi 在配置终结点时adress不需要指定svc,但是wcf服务需要 错误提示: System.ServiceModel.ProtocolException: The remote server returned an unexpected response: (405) Method ...
  • WEBAPI 返回一个html页面

    千次阅读 2018-11-30 18:01:18
    public HttpResponseMessage getHtml() { string uri = "http://docs.google.com/gview?embedded=true&amp;url=www.pdf995.com/samples/pdf.pdf"; ...
  • C# 调用HTTP接口两种方式Demo

    万次阅读 2019-05-17 16:33:06
    转载...在C#中,传统调用HTTP接口一般有两种办法: WebRequest/WebResponse组合的方法调用 WebClient类进行调用。 第一种方法抽象程度较低,使用较为繁琐;而WebClient主要面...
  • System.Net.WebClient封装了许多向服务器发送数据和从资源接收数据的实用方法。 项目中需要发送json数据给服务器的情况经常发生,以前一般是用原生的HttpWebRequest进行这个操作,但是需要写很多代码 如果使用...
  • WebClient 使用调用接口

    千次阅读 2018-06-29 19:36:43
    class Program { static void Main(string[] args) { TestMethod(); } public static void TestMethod() { var url = "http://localhost:80/api/Test/Test"...
  • HtmlUnit学习总结

    万次阅读 2016-09-13 15:58:54
    本文摘抄其他博客或者技术论坛,自己搜集整理如下: HtmlUnit学习总结 ...htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java...
  • 前段时间有师兄希望帮忙做一个类似于地理编码之类的东西,就是在表格里输入经纬度以后可以通过程序实现地理位置的批量输出,自己写了半天也没写出来, 在当时实习的项目经理(于老师)的指导下我才明白什么意思,...
  • public string getXingzuo(string s) { try { WebClient MyWebClient = new WebClient(); ... MyWebClient....调用这个API获得数据,在VS2008调试有数据,在微信客户端没有返回,各位大侠帮忙看看。。。。
  • C# WebApi Get请求方式传递实体参数

    千次阅读 2019-07-26 09:08:24
    对于WebApi,今天又有了一些新的了解。 话说,Get请求方式,参数会附在Url后面,称为QueryString,传递给服务器;而POST方式,则将参数放在消息体内。采用QueryString的话,简单,方便,但只适合参数比较少的情况;...
  • Spring(31)——WebClient介绍

    万次阅读 2018-07-28 10:15:54
    WebClient是从Spring WebFlux 5.0版本开始提供的一个非阻塞的基于响应式编程的进行Http请求的客户端工具。它的响应式编程的基于Reactor的。WebClient中提供了标准Http请求方式...可以通过WebClient.create()创建一...
  • WinForm 调用 WebApi 入门案例

    千次阅读 2019-04-15 10:54:23
    WinForm 调用 WebApi 入门案例 加载显示页面调用Load方法 private void Form1_Load(object sender, EventArgs e) { load(); } public void load() { **//url 你的WebApi 地址重要!!!** ...
1 2 3 4 5 ... 20
收藏数 2,497
精华内容 998
关键字:

webclient调用webapi