討論了那麼多Nginx集群的應用,本文就打造一個安卓App實例來展現給大家。WebApi好處就是無前端化,無論前端是PC機、筆記本、手機、平板電腦或者是IOS等,都可以通過集群,實現數據流的交互。如果要支持視頻流這些,就要另當別論了。MUI框架在國內是個不錯的框架,本次主要還是利用MUI框架實現一個... ...
目錄
1 大概思路... 1
2 Nginx集群之.Net打造WebApp(支持IOS和安卓) 1
3 安卓模擬器... 1
4 MUI框架... 3
5 編寫.NET WebApi的服務端... 4
6 在本機啟動WebApi 7
7 Nginx集群配置搭建... 8
8 運行結果... 9
9 總結... 15
1 大概思路
- Nginx集群之.Net打造WebApp(支持IOS和安卓)
- 安卓模擬器
- MUI框架
- 編寫.NET WebApi的服務端
- 在本機啟動WebApi
- Nginx集群配置
- 運行結果
- 總結
2 Nginx集群之.Net打造WebApp(支持IOS和安卓)
討論了那麼多Nginx集群的應用,本文就打造一個安卓App實例來展現給大家。
WebApi好處就是無前端化,無論前端是PC機、筆記本、手機、平板電腦或者是IOS等,都可以通過集群,實現數據流的交互。如果要支持視頻流這些,就要另當別論了。
MUI框架在國內是個不錯的框架,本次主要還是利用MUI框架實現一個簡單的APP,這個APP動態調用WebApi,利用XPATH方式爬蟲抓取博客園的文章,從而實現一個簡單的“天下網閱”APP。
以下是本文講述的主要結構圖:
手機“天下網閱”APP,訪問Nginx集群WebApi,然後抓取博客園文章,如下所示:
3 安卓模擬器
安卓模擬器可以採用夜神模擬器(可以採用原生的android模擬器,或者其它類型的模擬器),輸入以下adb命令:
Microsoft Windows [版本 6.1.7601] 版權所有 (c) 2009 Microsoft Corporation。保留所有權利。 C:\Users\zhyongfeng>cd D:\Program Files (x86)\Nox\bin C:\Users\zhyongfeng>d: D:\Program Files (x86)\Nox\bin>nox_adb connect 127.0.0.1:62001
4 MUI框架
MUI是最接近原生App體驗的前端框架,可多端發佈到Appstore、Android市場、瀏覽器、微信公眾號、百度直達號及流應用。
MUI相關的學習資源:http://dev.dcloud.net.cn/mui/
MUI使用的工具:HBuilder
運行CMD,輸入以下命令:
Microsoft Windows [版本 6.1.7601] 版權所有 (c) 2009 Microsoft Corporation。保留所有權利。 C:\Users\zhyongfeng>cd D:\DTLDownLoads\HBuilder_8.8.0_windows\HBuilder\tools\adb s C:\Users\zhyongfeng>d: D:\DTLDownLoads\HBuilder_8.8.0_windows\HBuilder\tools\adbs>adb connect 127.0.0.1:62001
5 編寫.NET WebApi的服務端
CnBlogsController.cs
using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text; using System.Web.Http; using Newtonsoft.Json; using HtmlAgilityPack; using WebAppCnBlogsApi.Models; namespace WebAppCnBlogsApi.Controllers { [RoutePrefix("api/CnBlogs")] public class CnBlogsController : ApiController { [Route("GetCnBlogs")] public string GetCnBlogs(int i) { string url = "https://www.cnblogs.com/mvc/AggSite/PostList.aspx"; HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); req.Method = "POST"; req.ContentType = "application/json; charset=utf-8"; object o = new { CategoryType = "SiteHome", ParentCategoryId = 0, CategoryId = 808, PageIndex = i, TotalPostCount = 4000, ItemListActionName = "PostList" }; //如果需要POST數據 byte[] data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(o)); req.ContentLength = data.Length; using (Stream stream = req.GetRequestStream()) { stream.Write(data, 0, data.Length); } HttpWebResponse response = (HttpWebResponse)req.GetResponse(); Stream streamReceive = response.GetResponseStream(); StreamReader streamReader = new StreamReader(streamReceive, Encoding.UTF8); string strResult = streamReader.ReadToEnd(); streamReader.Close(); streamReceive.Close(); req.Abort(); response.Close(); //解析HTML HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(strResult); HtmlNodeCollection cnBlogsNodeCollection = doc.DocumentNode.SelectNodes("//div[@class='post_item_body']"); List<HtmlCnBlogs> listCnBlogs = new List<HtmlCnBlogs>(); int j = 0; foreach(HtmlNode m in cnBlogsNodeCollection) { j++; HtmlCnBlogs cn = new HtmlCnBlogs(); HtmlNode author = m.SelectSingleNode("/div[" + j + "]/div[2]/div[1]/a[1]"); cn.author = author.InnerText.Trim(); cn.authorHref= author.Attributes["href"].Value; HtmlNode authorCreateTime = m.SelectSingleNode("/div[" + j + "]/div[2]/div[1]"); cn.createtime = authorCreateTime.ChildNodes[2].InnerText.Trim(); HtmlNode img = m.SelectSingleNode("/div["+j+"]/div[2]/p[1]/a[1]/img[1]"); if (img != null) cn.authorImg = string.Format("https:{0}", img.Attributes["src"].Value); HtmlNode h3 = m.SelectSingleNode("/div[" + j + "]/div[2]/h3[1]"); cn.title = h3.InnerText; HtmlNode titlelnk = m.SelectSingleNode("/div[" + j + "]/div[2]/h3[1]/a[1]"); cn.titlelink = titlelnk.Attributes["href"].Value; //簡介 HtmlNode content = m.SelectSingleNode("/div["+j+"]/div[2]/p[1]"); cn.content = content.InnerText.Trim(); //評論、評論URL HtmlNode comments = m.SelectSingleNode("/div[" + j + "]/div[2]/div[1]/span[1]/a[1]"); string strComments = comments.InnerText.Trim(); StringBuilder sbComments = new StringBuilder(); foreach (char c in strComments) { if (Convert.ToInt32(c) >= 48 && Convert.ToInt32(c) <= 57) { sbComments.Append(c); } } cn.commentsHref = comments.Attributes["href"].Value; cn.comments = int.Parse(sbComments.ToString()) ; HtmlNode views = m.SelectSingleNode("/div["+j+"]/div[2]/div[1]/span[2]/a[1]"); string strViews = views.InnerText.Trim(); StringBuilder sbViews = new StringBuilder(); foreach (char c in strViews) { if (Convert.ToInt32(c) >= 48 && Convert.ToInt32(c) <= 57) { sbViews.Append(c); } } cn.viewsHref= views.Attributes["href"].Value; cn.views = int.Parse(sbViews.ToString()); listCnBlogs.Add(cn); } return JsonConvert.SerializeObject(listCnBlogs); } } }
6 在本機啟動WebApi
將WebApi部署到以下10.93.85.66(因網路限制,所以這裡只在本機上執行啟動)
7 Nginx集群配置搭建
Nginx的集群配置:
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost zhyongfeng; location / { proxy_pass http://localhost:51690; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
運行CMD:
D:\DTLDownLoads\nginx-1.10.2>start nginx
D:\DTLDownLoads\nginx-1.10.2>nginx -s reload
8 運行結果
啟動安裝在手機端的APP(或者啟動HBuilder)
9 總結
通過Ningx集群,再使用MUI前端框架打包生成android的APP(也可以生成IOS的APP),WebApi提供了集群API的數據流訪問,通過API能夠動態抓取博客園的文章,並反饋到APP主頁上,從而完成了一個簡單的“天下網閱”APP設計。
源代碼下載:
http://download.csdn.net/download/ruby_matlab/10175001
PDF下載:
Nginx集群之.Net打造WebApp(支持IOS和安卓).pdf
App體驗版(無數據交互):
帳戶名:zhyongfeng
密碼:123456
https://files.cnblogs.com/files/yongfeng/TianXiaWangYue.apk