调用接口一般采用两种方式,webservice和webapi,此篇写webapi建立及测试
1.创建:
2.添加控制器到Controller文件夹,新建Api文件夹,将该控制器文件放入Api下,打开App_Start文件夹下webapiconfig,修改路由,
public static void Register(HttpConfiguration config) { config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } );
3.方法名定义注意点
a.如果方法名为post或者get,就是默认使用,在测试时,直接写到控制器LQInfo,然后传递方式设置为post即可,不需要写方法;
b.如果自定义方法,选择方式为get或者post,那么需要写到具体方法getcode();
在用 winform调用测试时,也需要写到方法:
private void button1_Click(object sender, EventArgs e) { string ashxSite = "http://localhost:80//ActionApi"; var client = new RestClient(ashxSite); var request = new RestRequest("/UserInfo/GetCode", Method.GET); request.AddParameter("Barcode", "WLS000021"); var response = client.Execute(request); // 从 WebAPI 获取 textBox2.Text = response.Content; }
4.参数注意点
a.如果参数只为一个:
[HttpPost] public string GetCode(string Barcode) { try { using (OracleConnection conn = new OracleConnection(connERP)) { string sql = @"select trim(a.t$mitm ) 编码,trim(b.t$dsca) 名称 from tablea a join tableb b on trim(a.t$pdno)=:a and a.t$mitm = b.t$item"; Object obj = conn.QueryFirstOrDefault(sql, new { a = Barcode }); if (obj != null) { string item = obj.ToString(); return item; } else return null; } } catch (Exception ex) { return "Error." + ex.Message; } }
b.从URL获取参数值的方式的弊端是URL有长度限制,当超过浏览器的最大URL长度时请求将被浏览器拒绝,根本不会发出去。
因此,当参数值过大时需要用[FromBody]参数进行传输,相当于一个类,将参数包含起来,使用postman测试时,参数列举见图3-a.
public class AX { public string url { get; set; } } public string Post([FromBody] AX arg ) { // 传入的字符串:"action=search&arg1=" + user + "&arg2=" + ED_tiaoMa.getText().toString(); // 先用&分割,再用=分割 string ip = HttpContext.Current.Request.UserHostAddress; if (arg!= null && !string.IsNullOrEmpty(arg.url)) { log.DebugFormat("Post:{0}", arg.url); var tmps = arg.url.Split('&'); string action = string.Empty; string arg1 = string.Empty; string arg2 = string.Empty; string arg3 = string.Empty; string arg4 = string.Empty; foreach (var item in tmps) { var tmps2 = item.Split('='); var s = tmps2[0].Trim().ToLower(); //第一个参数 方法 var _value = tmps2[tmps2.Length - 1].Trim(); //最后一个参数 if (tmps2.Length < 2) _value = string.Empty; if ("action".Equals(s, StringComparison.OrdinalIgnoreCase)) action = _value; else if ("arg1".Equals(s, StringComparison.OrdinalIgnoreCase)) arg1 = _value; else if ("arg2".Equals(s, StringComparison.OrdinalIgnoreCase)) arg2 = _value; else if ("arg3".Equals(s, StringComparison.OrdinalIgnoreCase)) arg3 = _value; else if ("arg4".Equals(s, StringComparison.OrdinalIgnoreCase)) arg4 = _value; } log.DebugFormat("Post: {0} / {1} / {2} / {3} / {4} / {5}", action, arg1, arg2, arg3, arg4, ip); if (string.IsNullOrWhiteSpace(action)) return "不支持此方法!"; var a1 = action.Trim().ToLower(); switch (a1) { case "getcode": { try { using (OracleConnection conn = new OracleConnection(connErp)) { string sql = @"select trim(a.t$mitm ) 编码,trim(b.t$dsca) 名称 from tablea a join tableb b on trim(a.t$pdno)=:a and a.t$mitm = b.t$item"; Object obj = conn.QueryFirstOrDefault(sql, new { a = arg1 }); if (obj != null) { string item = obj.ToString(); return item; } else return null; } } catch (Exception ex) { return "Error." + ex.Message; } } return action; } } return "Error." + arg.url; }
VS附加到进程调试(不用发布,可被调用)
点击调试-属性
选择调试—附加到进程,显示所有用户进程,找到w3wp进程,附加
进行生成,在postman调试
如果出现不进断点情况,右下角带感叹号,但是访问数据成功。检查重装电脑.net版本,对应应用程序。再试即可
【注】调用webapi时,便于他人解析,一般用JsonResult作为返回类型,
new JsonResult(){Data=""};
new JsonResult(){Data=lista};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类