调用HTTP接口两种方式Demo

本Demo大部分参考原著:http://www.jianshu.com/p/cfdaf6857e7e

在WebApi发布之前,我们都是通过WebRequest/WebResponse这两个类组合来调用HTTP接口的

封装一个RestClient类

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;

namespace WebApplication1
{
    public class RestClient
    {
        private string BaseUri;
        public RestClient(string baseUri)
        {
            this.BaseUri = baseUri;
        }

        #region Get请求
        public string Get(string uri)
        {
            //先根据用户请求的uri构造请求地址
            string serviceUrl = string.Format("{0}/{1}", this.BaseUri, uri);
            //创建Web访问对  象
            HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(serviceUrl);
            //通过Web访问对象获取响应内容
            HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
            //通过响应内容流创建StreamReader对象,因为StreamReader更高级更快
            StreamReader reader = new StreamReader(myResponse.GetResponseStream(),Encoding.UTF8);
            //string returnXml = HttpUtility.UrlDecode(reader.ReadToEnd());//如果有编码问题就用这个方法
            string returnXml = reader.ReadToEnd();//利用StreamReader就可以从响应内容从头读到尾
            reader.Close();
            myResponse.Close();
            return returnXml;
        }
        #endregion

        #region Post请求
        public string Post(string data, string uri)
        {
            //先根据用户请求的uri构造请求地址
            string serviceUrl = string.Format("{0}/{1}", this.BaseUri, uri);
            //创建Web访问对象
            HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(serviceUrl);
            //把用户传过来的数据转成“UTF-8”的字节流
            byte[] buf = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(data);

            myRequest.Method = "POST";
            myRequest.ContentLength = buf.Length;
            myRequest.ContentType = "application/json";
            myRequest.MaximumAutomaticRedirections = 1;
            myRequest.AllowAutoRedirect = true;
            //发送请求
            Stream stream = myRequest.GetRequestStream();
            stream.Write(buf,0,buf.Length);
            stream.Close();

            //获取接口返回值
            //通过Web访问对象获取响应内容
            HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
            //通过响应内容流创建StreamReader对象,因为StreamReader更高级更快
            StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
            //string returnXml = HttpUtility.UrlDecode(reader.ReadToEnd());//如果有编码问题就用这个方法
            string returnXml = reader.ReadToEnd();//利用StreamReader就可以从响应内容从头读到尾
            reader.Close();
            myResponse.Close();
            return returnXml;

        }
        #endregion

        #region Put请求
        public string Put(string data, string uri)
        {
            //先根据用户请求的uri构造请求地址
            string serviceUrl = string.Format("{0}/{1}", this.BaseUri, uri);
            //创建Web访问对象
            HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(serviceUrl);
            //把用户传过来的数据转成“UTF-8”的字节流
            byte[] buf = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(data);

            myRequest.Method = "PUT";
            myRequest.ContentLength = buf.Length;
            myRequest.ContentType = "application/json";
            myRequest.MaximumAutomaticRedirections = 1;
            myRequest.AllowAutoRedirect = true;
            //发送请求
            Stream stream = myRequest.GetRequestStream();
            stream.Write(buf, 0, buf.Length);
            stream.Close();

            //获取接口返回值
            //通过Web访问对象获取响应内容
            HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
            //通过响应内容流创建StreamReader对象,因为StreamReader更高级更快
            StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
            //string returnXml = HttpUtility.UrlDecode(reader.ReadToEnd());//如果有编码问题就用这个方法
            string returnXml = reader.ReadToEnd();//利用StreamReader就可以从响应内容从头读到尾
            reader.Close();
            myResponse.Close();
            return returnXml;

        }
        #endregion

        #region Delete请求
        public string Delete(string data, string uri)
        {
            //先根据用户请求的uri构造请求地址
            string serviceUrl = string.Format("{0}/{1}", this.BaseUri, uri);
            //创建Web访问对象
            HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(serviceUrl);
            //把用户传过来的数据转成“UTF-8”的字节流
            byte[] buf = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(data);

            myRequest.Method = "DELETE";
            myRequest.ContentLength = buf.Length;
            myRequest.ContentType = "application/json";
            myRequest.MaximumAutomaticRedirections = 1;
            myRequest.AllowAutoRedirect = true;
            //发送请求
            Stream stream = myRequest.GetRequestStream();
            stream.Write(buf, 0, buf.Length);
            stream.Close();

            //获取接口返回值
            //通过Web访问对象获取响应内容
            HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
            //通过响应内容流创建StreamReader对象,因为StreamReader更高级更快
            StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
            //string returnXml = HttpUtility.UrlDecode(reader.ReadToEnd());//如果有编码问题就用这个方法
            string returnXml = reader.ReadToEnd();//利用StreamReader就可以从响应内容从头读到尾
            reader.Close();
            myResponse.Close();
            return returnXml;

        }
        #endregion
    }
}

在Web API发布的同时,.NET提供了两个程序集:System.Net.HttpSystem.Net.Http.Formatting。这两个程序集中最核心的类是HttpClient

以前的用法:创建一个控制台程序,测试HTTP接口的调用。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WebApplication1;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            RestClient client = new RestClient("http://localhost:2444/");
            string result =  client.Get("api/Values");
            Console.WriteLine(result);
            Console.ReadKey();
        }
    }
}

.NET提供了两个程序集:System.Net.HttpSystem.Net.Http.Formatting。这两个程序集中最核心的类是HttpClient。在.NET4.5中带有这两个程序集,而.NET4需要到Nuget里下载Microsoft.Net.Http和Microsoft.AspNet.WebApi.Client这两个包才能使用这个类,更低的.NET版本就只能表示遗憾了只能用WebRequest/WebResponse或者WebClient来调用这些API了。

//控制台代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Formatting;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using WebApplication1;
using WebApplication1.Models;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //RestClient client = new RestClient("http://localhost:2444/");
            //string result =  client.Get("api/Values");
            //Console.WriteLine(result);
            //Console.ReadKey();

            var client = new HttpClient();
            //基本的API URL
            client.BaseAddress = new Uri("http://localhost:2444/");
            //默认希望响应使用Json序列化(内容协商机制,我接受json格式的数据)
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            //运行client接收程序
            Run(client);
            Console.ReadLine();
        }

        //client接收处理(都是异步的处理)
        static async void Run(HttpClient client)
        {
            //post 请求插入数据
            var result = await AddPerson(client);
            Console.WriteLine($"添加结果:{result}"); //添加结果:true

            //get 获取数据
            var person = await GetPerson(client);
            //查询结果:Id=1 Name=test Age=10 Sex=F
            Console.WriteLine($"查询结果:{person}");

            //put 更新数据
            result = await PutPerson(client);
            //更新结果:true
            Console.WriteLine($"更新结果:{result}");

            //delete 删除数据
            result = await DeletePerson(client);
            //删除结果:true
            Console.WriteLine($"删除结果:{result}");
        }

        //post
        static async Task<bool> AddPerson(HttpClient client)
        {
            //向Person发送POST请求,Body使用Json进行序列化

            return await client.PostAsJsonAsync("api/Person", new Person() { Age = 10, Id = 1, Name = "test", Sex = "F" })
                                //返回请求是否执行成功,即HTTP Code是否为2XX
                                .ContinueWith(x => x.Result.IsSuccessStatusCode);
        }

        //get
        static async Task<Person> GetPerson(HttpClient client)
        {
            //向Person发送GET请求
            return await await client.GetAsync("api/Person/1")
                                     //获取返回Body,并根据返回的Content-Type自动匹配格式化器反序列化Body内容为对象
                                     .ContinueWith(x => x.Result.Content.ReadAsAsync<Person>(
                    new List<MediaTypeFormatter>() {new JsonMediaTypeFormatter()/*这是Json的格式化器*/
                                                    ,new XmlMediaTypeFormatter()/*这是XML的格式化器*/}));
        }

        //put
        static async Task<bool> PutPerson(HttpClient client)
        {
            //向Person发送PUT请求,Body使用Json进行序列化
            return await client.PutAsJsonAsync("api/Person/1", new Person() { Age = 10, Id = 1, Name = "test1Change", Sex = "F" })
                                .ContinueWith(x => x.Result.IsSuccessStatusCode);  //返回请求是否执行成功,即HTTP Code是否为2XX
        }
        //delete
        static async Task<bool> DeletePerson(HttpClient client)
        {
            return await client.DeleteAsync("api/Person/1") //向Person发送DELETE请求
                               .ContinueWith(x => x.Result.IsSuccessStatusCode); //返回请求是否执行成功,即HTTP Code是否为2XX
        }

    }
}

这个例子就是控制台通过HttpClient这个类调用WebApi中的方法,WebApi就是项目新创建的ValuesController那个控制器,什么都没动,测试结果如下:

时间: 2024-10-14 01:09:48

调用HTTP接口两种方式Demo的相关文章

JS调用webservice的两种方式

协议肯定是使用http协议,因为soap协议本身也是基于http协议.期中第二种方式:只有webservice3.5以后版本才可以成功 第一种方式:构造soap格式的body,注意加粗的黄色标识,比如: createXMLHttpRequest();     var data;     data = '<?xml version="1.0" encoding="utf-8"?>';     data = data + '<soap:Envelope

Delphi 调用Dll的两种方式

unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender

java调用url的两种方式

一.在java中调用url,并打开一个新的窗口 Java代码   String url="http://10.58.2.131:8088/spesBiz/test1.jsp"; String cmd = "cmd.exe /c start " + url; try { Process proc = Runtime.getRuntime().exec(cmd); proc.waitFor(); } catch (Exception e) { e.printStackT

jquery easyui 调用dialog的两种方式

1. <div class="easyui-dialog" id="dd" title="My Dialog" style="width:400px;height:200px;"> Dialog Content. helloWord </div> 2. <script type="text/javascript"> $(function(){ $('#dd').dialo

vc导出调用dll的两种方式

一.stdcall 1. #define  DLLEXPORT _declspec(dllexport) _stdcall, int DLLEXPORT func(const char *peer,unsigned int port); 2. #define DLLIMPORT _declspec(dllimport) _stdcall, int DLLIMPORT func(const char *peer,unsigned int port); 二.extern"C"按C标准导出

springcloud 服务调用的两种方式

spring-cloud调用服务有两种方式,一种是Ribbon+RestTemplate, 另外一种是Feign.Ribbon是一个基于HTTP和TCP客户端的负载均衡器,其实feign也使用了ribbon, 只要使用@FeignClient时,ribbon就会自动使用. 一.Ribbon 1.1新建模块client-apom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="

创建线程的两种方式

首先我们需要知道什么是线程:是程序执行流的最小单元,包括就绪.阻塞和运行三种基本状态. 举个简单的例子:我们把生活中的两件事吃饭和写作业当作是两个线程,当你正在写作业的时候,爸妈叫你吃饭,你就直接去了,等吃完饭回来后再接着写作业.这就是相当于两个线程其中一个从运行状态转入就绪状态,另一个线程从就绪状态转入运行状态. 创建线程包括继承Thread类和实现Runnable接口两种方式(JDK5.0以后还包括了实现Callable等方式来实现线程,这里不做介绍,感兴趣的小伙伴可以自己查资料),下面介绍

python用requests和urllib2两种方式调用图灵机器人接口

最近从网上看见个有意思的图灵机器人,可以根据不同的信息智能回复,比如你发送一个"讲个笑话",它就会给你回复一个笑话,或者"北京天气"就可以回复天气情况,或者英文单词然后给你回复中文释义.官方文档中有php和java的调用方式,我就弄个python的吧. 注册获取API KEY 这一步很简单,直接注册一个账号就可以看到你的API KEY.这个KEY我们以后发送get请求的时候需要用到. Pythoh调用示例 掉用也比较简单,主要是模拟post 请求.然后解析 json

JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序

一.描述 自定义的类要按照一定的方式进行排序,比如一个Person类要按照年龄进行从小到大排序,比如一个Student类要按照成绩进行由高到低排序. 这里我们采用两种方式,一种是使用Comparable接口:让待排序对象所在的类实现Comparable接口,并重写Comparable接口中的compareTo()方法,缺点是只能按照一种规则排序. 另一种方式是使用Comparator接口:编写多个排序方式类实现Comparator接口,并重写新Comparator接口中的compare()方法,