关于C#winform怎么调⽤webapi来获取到json数据
C/S系统也可以和B/S系统⼀样实现“前后端分离”,那这样写winform就相当于纯粹的前端页⾯了,然后再单独部署⼀个webapi项⽬,通过api调⽤数据库进⾏数据的操作,有利于维护和数据安全性的提⾼,那么winform怎么去调⽤api接⼝呢,写了⼀个demo,⼤家借鉴⼀下哈,本⼈才疏学浅,有不⾜和错误请指出:
winform界⾯就不设计了,仅仅是为了测试是否调⽤到api,直接在创建的类库中写⼀个⽅法:
[csharp]
1. /// <summary>
2. /// 调⽤api返回json
3. /// </summary>
百度api接口4. /// <param name="url">api地址</param>
5. /// <param name="jsonstr">接收参数</param>
6. /// <param name="type">类型</param>
7. /// <returns></returns>
8. public static string HttpApi(string url, string jsonstr, string type)
9. {
10. Encoding encoding = Encoding.UTF8;
11. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);//webrequest请求api地址
12. request.Accept = "text/html,application/xhtml+xml,*/*";
13. request.ContentType = "application/json";
14. request.Method = type.ToUpper().ToString();//get或者post
15. byte[] buffer = encoding.GetBytes(jsonstr);
16. request.ContentLength = buffer.Length;
17. request.GetRequestStream().Write(buffer, 0, buffer.Length);
18. HttpWebResponse response = (HttpWebResponse)request.GetResponse();
19. using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
20. {
21. return reader.ReadToEnd();
22. }
23. }
然后再winform界⾯的事件中调⽤该⽅法:
[csharp]
1. private void button3_Click(object sender, EventArgs e)
2. {
3. string url = "...(此处为api端⼝)/api/VisitorInfo/GetEndVisitorInfoList";
4. var str = ApiHelper.HttpApi(url, "{}", "get");
5. }
本地运⾏后变量str接收数据格式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34HttpWebRequest request = (HttpWebRequest)WebRequest.Create(postUrl); //--需要封装的参数
request.CookieContainer = new CookieContainer();
CookieContainer cookie = request.CookieContainer;//如果⽤不到Cookie,删去即可
//以下是发送的http头
request.Referer = "";
request.Accept = "Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.Headers["Accept-Language"] = "zh-CN,zh;q=0.";
request.Headers["Accept-Charset"] = "GBK,utf-8;q=0.7,*;q=0.3";
request.UserAgent = "User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1"; request.KeepAlive = true;
//上⾯的http头看情况⽽定,但是下⾯俩必须加
request.ContentType = "application/x-www-form-urlencoded";
Encoding encoding = Encoding.UTF8;//根据⽹站的编码⾃定义
request.Method ="get"; //--需要将get改为post才可⾏
string postDataStr;
Stream requestStream = request.GetRequestStream();
if (postDatas != "")
{
postDataStr=postDatas;//--需要封装,形式如“arg=arg1&arg2=arg2”
byte[] postData = encoding.GetBytes(postDataStr);//postDataStr即为发送的数据,
request.ContentLength = postData.Length;
requestStream.Write(postData, 0, postData.Length);
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader streamReader = new StreamReader(responseStream, encoding);
string retString = streamReader.ReadToEnd();
streamReader.Close();
responseStream.Close();
return retString;
如果是以流的⽅式提交表单数据的时候不能使⽤get⽅法,必须⽤post⽅法,
改为
1request.Method ="post"; 就可以了。做⼀个记号
今天请求接⼝直接调了以前写好的⽅法,结果报了(405)不⽀持⽅法的错误,⼀看是GET写成POST了,改成GET之后,⼜报了⽆法发送具有此谓词类型的内容正⽂错误的错误原来之前的⽅法⾥⾯有GetRequestStream(), GET请求并不⽀持它。
把GetRequestStream()和相应的代码注释掉就OK了
// Stream outStream = myRequest.GetRequestStream(); // outStream.Write(arrB, 0, arrB.Length);
//outStream.Close();
特此记录!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论