鏈接生成接口
近日公司需要用到短鏈接,遂想是否可以找個現成的生成接口來用,於是乎就去擺渡,目前有百度家的短鏈接和新浪家的短鏈接,不巧的是百度家的短鏈竟然不支持我們這個長鏈接的生成,難道是因為傳入的長鏈接參數是一個guid數字太長的原因?反正搞不懂為啥這么坑爹,沒辦法只能用新浪嘍。尼瑪查看了接口介紹才發現不能愉快的玩耍了。我只是想生成個短鏈而已,為啥這么坑爹要求登錄還傳入各種參數?繼續擺渡看了第三方封裝的,發現至少都要登陸,就沒有一個簡單共別人使用的,這里就想問下那些提供商就不能秉承共享精神,免費提供大家簡單的使用嗎?既然找不到,那也不能放棄,否則因為這個事公司讓我滾蛋了,那就完犢子了,尼瑪LA才剛轉正啊,傷不起啊。
仔細查找發現新浪提供的短鏈生成接口有兩版,v2版需要用戶登錄持有token去調用短鏈,這個要是沒調用一次都去看看是否要去登錄的話就違背了我們簡單調用的宗旨,遂放棄。再看v1版,這個只需要在參數中帶入應用appkey進去即可,ok這個就各種符合了就好辦了,研究下接口,需要提供兩個參數:1.source這個就是應用的appkey。2.url_long這個可以傳入多個,看來是用來支持批量生成的。我用的是微軟的webapi來寫的,煩請各位看官先了解一些webapi的知識再繼續,下面開始貼代碼:
1.新建一個控制器ShortUrlController,添加一個獲取傳入參數的接口Get方法,如下
2.封裝新浪的短鏈接v1接口ShortUrl

public static result Get(List<string> longUrl)
{
var res = "";
bool flg = false;
var statusCode = 400;
var msg = "";
try
{
if (longUrl == null)
{
#region 參數為空
flg = false;
statusCode = 400;
msg = "請傳入請求參數";
res = "";
#endregion
}
else
{
#region 參數不為空
var appkey = CfgParams.AppKey;
var url = SinaApi.ShortUrl;
//url += "?source=" + appkey + "&url_long=" + longUrl;
longUrl = longUrl.Select(a=>a=HttpUtility.UrlEncode(a,Encoding.UTF8)).ToList();
var longurl = string.Join("&url_long=", longUrl);
url = string.Format(url, appkey, longurl);
var handler = new HttpClientHandler()
{
AutomaticDecompression = DecompressionMethods.GZip
};
using (var http = new HttpClient(handler))
{
HttpResponseMessage response = http.GetAsync(url).Result;
if (response.IsSuccessStatusCode)
{
flg = true;
statusCode = 200;
msg = "成功";
res = response.Content.ReadAsStringAsync().Result;
}
else
{
flg = false;
statusCode = 400;
msg = "請求無效";
}
}
#endregion
}
}
catch
{
flg = false;
statusCode = 500;
msg = "內部服務器錯誤";
}
result resmodel = new result();
resmodel.status = flg;
resmodel.statuscode = statusCode;
resmodel.message = msg;
if (statusCode == 200)
resmodel.urls = JsonConvert.DeserializeObject<List<url>>(res); ;
return resmodel;
}
請注意這里必須對傳入的長鏈接進行編碼,否則在需要編碼的鏈接中有多個參數的話會被誤以為是接口鏈接的參數而被截斷。
3.新建SinaApi類,這里編寫提供新浪鏈接的接口地址
4.獲取webconfig配置信息的類,這里主要是用來提供新浪appkey的
5.為了提供一個瀏覽器直接訪問都可以看到的接口形式,專門編寫了一個result和url兩個類用來映射
OK 到這里就結束了,可以測試一下然后發布使用了。
PS:這里有個發布好的大家可以免費調用。地址:http://api.tuichu.net/shorturl/shorten,demo:http://api.tuichu.net/shorturl/shorten/?url_long=http://www.baidu.com&url_long=http://360.cn
( 因為考慮到訪問速度問題,所以這個發布的在阿里雲上,LA 沒有服務器,沒有域名備案,所以這個接口服務是由朋友南京推網提供,如若不能訪問請直接拿板磚去拍,LA不概不負責)
工作了幾年,寫過程序也運營過網站,自定義錯誤也很熟悉了,最近再做項目發現有同事寫了這樣的代碼
if (action != null) { id = Request.QueryString["id"].GetString().GetInt(); if (!IsPostBack) { DataInit(); if (action.Equals("edit")) { BindData(); } } } else { Response.Redirect("/error/403.html"); }
乍看一下,不錯邏輯還是挺清晰的,如果請求為空就把頁面重定向到沒有訪問權限的頁面,可能大部分的人都這么寫,也可能是學校里老師就這么教的吧,沒有權限redirect到另一個頁面。這樣問題就來了,我的錯誤頁面一定是放在那個路徑下的嗎?如果哪一天我整體移動了錯誤頁面的位置,還要把每個頁面下的重定向路徑修改掉,這樣寫你玩的可嗨啊。如果這樣那微軟為我們提供了在自定義錯誤頁面的意義何在?以上絕沒有批評的意思,或許看到這許多人開始暗罵:你個吊人說了這么多,自己又能寫成啥鳥樣子。呵呵不急。
我們知道自定義錯誤頁面有兩種方法,當然我說的局限與asp.net和iis上,沒玩過其他的平台。一種在iis上做處理還一種就是webconfig做配置,如還有其他謝謝來信指正。現在就出現我們該如何來應用這些自定義錯誤,首先像上面那段代碼一定是不對的了,那我們該如何來寫?或許有人會想到誒~頁面出錯的時候會出現錯誤碼StatusCode是不是設置這個呢?當然你可以去試一下,不錯接近了,可惜不是,心中是不是有些少許失落,別氣餒同一個思路,既然是錯誤頁面,在程序里什么的情況下叫錯誤呢?應該是所有人都遇到過那就是異常,對拋出異常,異常就是錯誤,迫不及待的我們再試一次,注意這里拋出的是http異常,啪啪啪敲完調試運行成功。哈哈哈像我們所希望的那樣開始運行了,至此開始破口大罵,砸鍵盤摔電腦下班走人。
代碼如下:
if (action != null) { id = Request.QueryString["id"].GetString().GetLong(); if (!IsPostBack) { DataInit(); if (action.Equals("edit")) { BindData(); } } } else { throw new HttpException(416,"請求范圍不被允許"); }
webconfig配置如下:
<customErrors mode="RemoteOnly" defaultRedirect="/index.aspx"> <error statusCode="401" redirect="/login.aspx"/> <error statusCode="403" redirect="/error/403.html"/> <error statusCode="404" redirect="/error/404.html"/> <error statusCode="416" redirect="/error/416.html"/> </customErrors>
如果還有其他的自定義錯誤照此添加,當然你也可以不在webconfig里配置而是修改iis上你這個站點的錯誤頁面配置。
謝謝耐心的看完,以上純屬個人拙見,如有錯誤歡迎指正。