欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#调用接口注意要点

程序员文章站 2022-07-07 08:23:10
在用C#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存Cookie值才能有权限调用, 所以首先需要通过调用登录接口来保存cookie值,再进行其他接口的调用 1.通过Get方式 但是并不是所有的get请求都需要添加这个heard的内容,有些加了这个 ......

在用c#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存cookie值才能有权限调用,

所以首先需要通过调用登录接口来保存cookie值,再进行其他接口的调用

1.通过get方式

        #region get方式

        public string httpget(string url)
        {

            encoding encoding = encoding.utf8;
            httpwebrequest request = (httpwebrequest)webrequest.create(url);
            request.method = "get";
            request.contenttype = "application/json";
            request.headers["accept-encoding"] = "gzip,deflase";
            request.automaticdecompression = decompressionmethods.gzip;
            httpwebresponse response = (httpwebresponse)request.getresponse();

            // httpcookie cookies = new httpcookie("admin");  //如果有需要通过登录实现保存cookie值的话可以加一部分
            // cookies.value = convert.tostring(response.headers["set-cookie"]); // 通过响应请求读取带cookie的http数据
            // cookies.expires = datetime.now.adddays(1);
            //  httpcontext.current.response.cookies.add(cookies);

            using (streamreader reader = new streamreader(response.getresponsestream(), encoding.utf8))
            {
                return reader.readtoend();
            }
        }
        #endregion

 

但是并不是所有的get请求都需要添加这个heard的内容,有些加了这个可能出现乱码的情况,所以不要设置accept-encoding的header

此处之所以加此header,是因为看到网页分析工具中所得到的浏览器浏览该网页,对应的http的header的内容中,就是这样设置的。

所以,代码中,也是模拟浏览器去访问网页,就设置了对应的accept-encoding为gzip,deflate了

普通浏览器访问网页,之所以添加:"accept-encoding" = "gzip,deflate"

那是因为,浏览器对于从服务器中返回的对应的gzip压缩的网页,会自动解压缩,所以,其request的时候,添加对应的头,表明自己接受压缩后的数据。

同时添加了 request.automaticdecompression = decompressionmethods.gzip;这一句,便可以获得正确的数据。

如果你获取网页内容太大的话,那么还是可以用这个办法的,这样就可以让httpwebrequest自动帮你实现对应的解压缩了,可以减少数据数据传输量,节省时间,提高效率。

2.通过post方式

public string httppost2(string url, string body)
{

   //把用户传过来的数据转成“utf-8”的字节流
    encoding encoding = encoding.utf8;
    //先根据用户请求的uri构造请求地址
    //创建web访问对象
    httpwebrequest request = (httpwebrequest) webrequest.create(url);
    request.method = "post";
    // request.accept = "application/json";
   request.contenttype = "application/json; charset=utf-8";
   request.headers["accept-encoding"] = "gzip, deflate";
   request.automaticdecompression = decompressionmethods.gzip;
   //httpcookie cookie = system.web.httpcontext.current.request.cookies["admin"];  //若是需要登录过后再能访问获取url的数据,需要在请求头中设置cookie值
   //if (cookie != null)
   //    request.headers.add("cookie", cookie.value.tostring());

   byte[] buffer = encoding.getbytes(body);
   request.contentlength = buffer.length;
   request.getrequeststream().write(buffer, 0, buffer.length);
   //通过web访问对象获取响应内容
   httpwebresponse response = (httpwebresponse) request.getresponse();
   //通过响应内容流创建streamreader对象,因为streamreader更高级更快
   using (streamreader reader = new streamreader(response.getresponsestream(), encoding.utf8))
   {
    return reader.readtoend();//利用streamreader就可以从响应内容从头读到尾
   }
 }

3.通过put请求

        #region put请求
        public string put(string data, string uri)
        {//创建web访问对象
            httpwebrequest request = (httpwebrequest)webrequest.create(uri);
            //把用户传过来的数据转成“utf-8”的字节流
            byte[] buf = system.text.encoding.getencoding("utf-8").getbytes(data);

            request.method = "put";
            request.contentlength = buf.length;
            request.contenttype = "application/json";
            request.maximumautomaticredirections = 1;
            request.allowautoredirect = true;
            //发送请求
            stream stream = request.getrequeststream();
            stream.write(buf, 0, buf.length);
            stream.close();

            //获取接口返回值
            //通过web访问对象获取响应内容
            httpwebresponse response = (httpwebresponse)request.getresponse();
            //通过响应内容流创建streamreader对象,因为streamreader更高级更快
            streamreader reader = new streamreader(response.getresponsestream(), encoding.utf8);
            //string returnxml = httputility.urldecode(reader.readtoend());//如果有编码问题就用这个方法
            string returnxml = reader.readtoend();//利用streamreader就可以从响应内容从头读到尾
            reader.close();
            response.close();
            return returnxml;

        }           
        #endregion

4.通过delete请求

        #region delete请求
        public string delete(string data, string uri)
        {
            //创建web访问对象
            httpwebrequest request = (httpwebrequest)webrequest.create(uri);
            //把用户传过来的数据转成“utf-8”的字节流
            byte[] buf = system.text.encoding.getencoding("utf-8").getbytes(data);

            request.method = "delete";
            request.contentlength = buf.length;
            request.contenttype = "application/json";
            request.maximumautomaticredirections = 1;
            request.allowautoredirect = true;
            //发送请求
            stream stream = request.getrequeststream();
            stream.write(buf, 0, buf.length);
            stream.close();

            //获取接口返回值
            //通过web访问对象获取响应内容
            httpwebresponse response = (httpwebresponse)request.getresponse();
            //通过响应内容流创建streamreader对象,因为streamreader更高级更快
            streamreader reader = new streamreader(response.getresponsestream(), encoding.utf8);
            //string returnxml = httputility.urldecode(reader.readtoend());//如果有编码问题就用这个方法
            string returnxml = reader.readtoend();//利用streamreader就可以从响应内容从头读到尾
            reader.close();
            response.close();
            return returnxml;

        }
       #endregion

不同的场景需求,使用不同的方式,应用在不同的场景 。

通过这几种组合方式 ,可以调用http接口,完成调用和测试。