訪問webapi
A. xamarin.forms或微信小程序 調用本機webapi失敗
和微信小程序一樣,模擬器調用webapi不能使用https://localhost:5001
右鍵webapi找到屬性
修改成web啟動
找到webapi裡面的Properties文件下的launchsettings.json
修改成本機IP
B. 如何使用程序調用webApi介面
functiongetAPI(url){
returnnewPromise((resolve,reject)=>{
$.ajax({
url:url,
type:'GET',
dataType:'json',
data:{param1:'value1'},
})
.done(function(data){
resolve({data:data})
})
});
}
let_api=awaitthis.getAPI(url);
這是我用ES6與非同步方式寫的url就是調用的API地址
C. WebApi 2 路由機制
.net中包含的路由有兩種,第一種是MVC模式的按url匹配action,第二種是WebApi模式的按http請求的方法匹配action,本文我們學習WebApi的路由模式。
首先新建一個WebApi項目,選擇ASP.NET Web應用程序(.NET Framework)
這里我們首先來看WebApi的基礎配置 WebApiConfig.cs ,其路徑為 /App_Start/WebApiConfig.cs
首先以瀏覽器啟動webapi項目
會發現頁面顯示403,這是很正常的,因為我們在新建項目的時候沒有加入MVC,所以沒有可視化的view頁面,不過我們卻拿到了這個項目的 埠號
為了更加方便直觀的看我們的介面請求,我們選擇postman,首先在項目新建一個 controller
通過以上的操作,我們就搭建好了一個webApi2的項目工程,後面我們就在這個工程的基礎上進行webApi 2的開發和學習。
webApi的路由過程主要經歷了如下三步
WebApiConfig.cs 這個文件是進行路由表的核心文件, WebApiConfig 裡面只有一個方法,這個方法在 Global.asax 文件里的 Application_Start() 方法被調用, Global.asax 文件是一個全局文件,當我們網頁啟動時就會去執行它。 Register(HttpConfiguration config) 方法是配置WEB API路由的。
因此 在webAP工程啟動的時候,會執行 Global.asax ,這個文件裡面注冊了 WebApiConfig.cs 的一系列初始化配置,從而實現了webapi。
WebApi 2 框架使用路由表。 並由Web API 的 Visual Studio 項目模板創建默認路由
轉到 MapHttpRoute 的定義,可以看到它有4個重載
分別來看看各個參數的作用
webApi2工程自動為我們創建了默認的路由
經過上面的講解,我們知道了匹配的URL是 api/{controller}/{id}
那麼我們在實際的請求中應該如何請求
新建一個 StudentsController
依次對以下地址進行請求
總結:
默認路由的缺點
如下
添加如下的方法(action)
得到了一下的結果
我們來看看這個請求是如何進行匹配的,首先找到 /App_Start/WebApiConfig.cs
按照路由模板來看,我們請求的路由沒有 action 名稱,那麼它是怎麼進行匹配的呢?
其實當我們訪問 http://localhost:65066/api/student 這個url的時候,webapi會自動去匹配 api/{controller}/{id} 這個模板,在這個路徑中,student是controller,那麼它又是怎麼去找到 getStudentName 這個action的呢?明明我們都沒有傳action這個參數,其實Webapi的路由規則是通過http方法去匹配對應的action,我們請求這個地址是用的 GET 方法,那麼webapi會找Order這個控制器裡面的get請求的方法,同事我們的這個 getStudentName 是以 get 開頭的,它符合了webapi的匹配規則,於是就請求成功了,但前提是你寫的方法必須是以get開頭的,如果當前這個controller一個get開頭的都沒有,那麼就顯示 請求的資源不支持 http 方法「GET」 。
當然不以get開頭的前提是你必須加上 [HttpGet] 這個特性,webapi才知道你這個是get的請求方法,就能正確進行匹配。
然後我們再回到 /App_Start/WebApiConfig.cs ,看下裡面 MapHttpRoute 的各個參數的含義,首先轉到它的定義,發現它是 HttpRouteCollection 的擴展方法, MapHttpRoute 有4類重載
在 WebApiConfig.cs 裡面修改為如下的路由模板
介面請求如下
通過 action 的名稱來匹配很好理解,上面的 StudentName() 是方法名, webApi 會默認它就是 action 的名稱,如果你想要方法名和 action 的名稱不一致,你也可以自定義 action 的名稱,這個可以通過特性 ActionName 來實現,如下:
首先看路由模板
對於同請求類型,同請求參數的請求,會出現 不傳參數,找不到匹配的資源 或 傳了參數,但是找到了與該請求匹配的多個操作 的問題,如下所示
解決以上的辦法有兩種
如果要使用特性路由,首先在 WebApiConfig.cs 的 Register 方法裡面必須先啟用特性路由(一般情況下,當我們新建一個 WebApi 項目的時候,會自動在 Register 方法裡面加上這句話。)
特性路由的目的是為了解決我們公共路由模板引擎解決不了的問題。一個action定義了特性路由之後,就能通過特性路由上面的路由規則找到。
只要出現了特性路由,匹配的規則是按特性路由來的
修改studentController如下
參考
參考
路由前綴的一般的做法是在控制器上面使用特性 [RoutePrefix] 來標識。
但是需要注意路由前綴不能以 / 開頭
D. MVC WebApi在調試開發下訪問正常,部署到伺服器訪問不到介面
1、伺服器是否正常啟動(查看日誌)
2、伺服器的IP+PORT是否可以訪問,查看埠是否被佔用
3、若服務正常啟動,埠也可以訪問,查看你的訪問路徑是否正確(部署後的上下文webcontent是否與調試中一致)
4、訪問不到有很多原因,要看你面對的具體問題去排查,比如報錯信息之類~
E. .net webapi介面訪問提示 thread was being aborted
在捕獲異常的try塊中使用
response.redirect();
或
response.write();response.end();
有時會提示線程已被中止(英文:"Thread was being aborted")錯誤;(該錯誤不會每次都產生,在相同地方只是偶爾會出現)
分析該錯誤的原因是由於執行這兩個命令會重新發起一次請求,將當前請求的進程abort掉;通俗點講就是當進程還想繼續執行的時候, 發現自己已經被調用過Abort方法了. 既然自己作為線程已經被中止, 就無法執行了, 於是exception丟了出來。
解決方法有如下三種:
1、將這兩個命令放到try/catch塊外,不捕獲異常就不會提示這個錯誤;
2、捕獲異常時進行判斷:
try
{}
catch(Exception e)
{
if(!(ex is System.Threading.ThreadAbortException))
{
//在這里顯示錯誤
}
}
3、捕獲進程終止錯誤不做處理
try
{}
catch (ThreadAbortException)
{ }
catch(Exception ex)
{
//顯示錯誤
}
有網友說可以在Response.Write();前加上Response.Clear();不知道這個方法是否可行;
轉自http://www.cnblogs.com/xyd21c/archive/2011/02/24/1963748.html
F. pyside6調用webapi
通過介面錄入資料庫。pyside6調用webapi介面,產生的數據通過介面錄入資料庫,WebApi是一個編程介面,用於操作可通過標准HTTP方法和標頭訪問的系統。
G. WebAPIs基本操作
1、作用: 製作網頁特效和用戶交互
2、組成:
1)DOM:操作頁面元素;(document頂級對象)
2)BOM:操作瀏覽器。
1)優點:靈活, 所有CSS選擇器都可以使用;
2)獲取單個元素:document.querySelector('選擇器'),選擇器不存在的話,獲取結果為null,結果可以直接使用;
3)獲取多個同一類元素:document.querySelectorAll('選擇器'),拿到的結果: NodeList偽數組,通過遍歷數組獲取對應元素。
PS:偽數組:存在著length屬性,可以通過數組下標的方式進行每個元素的訪問,但是不能夠使用push等數組的方法。
1)getElementById('id值'): 獲取單個元素;
2)getElementsByTagName('標簽名'):獲取多個同一類元素;(偽數組)
3)getElementsByClassName('類名'): 獲取多個同一類元素。(偽數組)
1)a的href,img的src、alt、title等;
2)屬性: 可以訪問, 也可以修改
3)語法: 元素.屬性名 = 屬性值
1)innerText:針對文本: 不識別標簽;
2)innerHTML:針對所有: 包括標簽;(常用,innerHTML可實現innerText功能)
1)行內樣式:
適用於: 單行樣式修改;
語法:元素.style.樣式名 = 樣式值;
操作的只能是行內的樣式;
操作的結果要帶單位;
一定是小駝峰, 沒有中劃線;
2)類名操作:
語法:元素.classList;
元素.classList.add('類名') : 追加類;
元素.classList.remove('類名') : 移除類;
元素.classList.toggle('類名') : 切換類。
1)type: input標簽的password和text;
2)value: 所有表單屬性;
獲取值: 元素.value;
修改值: 元素.value = 新值;
3)checked: 選中;
true: 選中;
false: 不選中;
4)disabled: 禁用;
true: 禁用;
false: 不禁用。
H. 請問html的js調用webapi介面
引用jquery,有很方便的GET調用方法:
<!DOCTYPEhtml>
<html>
<head>
<metahttp-equiv="content-type"content="text/html;charset=UTF-8">
<metaname="viewport"content="width=device-width,initial-scale=1">
<!--src值為文件位置路徑-->
<scripttype="text/javascript"charset="UTF-8"src="javascript/jquery-1.12.1.js"></script>
<title>測試案例</title>
<!--語法:jQuery.getJSON(url,data,success(data,status,xhr))-->
<scripttype="text/javascript"charset="UTF-8">
functiongetToken(){
$.getJSON("http://localhost/kdapi/api/access_token",{"id":111,"secret":2352532},function(result){
alert(result.access_token);
});
}
</script>
</head>
<body>
<buttononclick="getToken()"style="width:120px;height:60px;">獲取Token</button>
</body>
</html>
I. 如何訪問WebAPI介面被惡意調用
先定義一個簡單的webapi,簡單到差不多直接用vs2010自動生成的webapi代碼。 其中的TestModle是一個簡單的class,如下 public class TestModle { public string a { get; set; } public string b { get; set; } public string c { get; set; } } 前端頁面放四個代表get,post,put,delete的按鈕,在加一個div顯示返回值 前端代碼中載入jquery,在定義四個按鈕的click事件 get和post,我習慣用$.get和$.post,當然也能用$.ajax. get直接返回webapi get的return值,post的話我就不在後端做處理了直接返回傳入的值,這里只做示範 put和delete,只能用$.ajax來處理。 put的話一般用於update某個id的數據信息 delete用於刪除某個id的數據,如下圖所示 點擊每個按鈕,可以在頁面上看到相應的效果