首先很无聊,想提升自己水平,所以就写了。
1、vs2017创建了个mvc webapi 框架.net framework4.5
添加一个api控制器,名字随便起的(我喜欢用帕斯卡命名法 即pascal命名法)
2、然后创建如下方法,实话说多半是网上直接复制,然后组装下(我是在本机上试)
using Common.NetJson;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Web.Http;
using System.Xml;
namespace Reptilian.Controllers
{
public class GetImagesController : ApiController
{
public IEnumerable<string> Get()//解决跨域问题
{
return new string[] { "value1", "value2" };
}
public string Images(string Key)
{
if (Key=="kaishi")
{
if (Str().Length>5)
{
JsonResult json = new JsonResult();
Random ram = new Random();
Dictionary<int, string> dic = new Dictionary<int, string>();
for (int i = 0; i < 5; i++)
{
dic[i] = Str()[ram.Next(Str().Length - 1)];
}
json.rows = dic;
json.success = true;
json.total = Str().Length;
return JsonConvert.SerializeObject(json);
}
}
return "nothing to you";
}
private string[] Str()
{
string pageHtml = string.Empty;
string url = "http://photo.sina.com.cn/";
StringBuilder sb = new StringBuilder();
WebClient MyWebClient = new WebClient();
MyWebClient.Credentials = CredentialCache.DefaultCredentials;//获取或设置用于向Internet资源的请求进行身份验证的网络凭据
Byte[] pageData = MyWebClient.DownloadData(url); //从指定网站下载数据
//string pageHtml = Encoding.Default.GetString(pageData); //如果获取网站页面采用的是GB2312,则使用这句
pageHtml = Encoding.UTF8.GetString(pageData); //如果获取网站页面采用的是UTF-8,则使用这句
string regImg = @"(?is)<img\s+((?<key>[^=]+)=([""']?)(?<value>[^'""]+)\2\s*)+?\s*/?>([^<>]*?</img>)?";
MatchCollection matches = Regex.Matches(pageHtml, regImg, RegexOptions.IgnoreCase);
string[] imgs = new string[matches.Count];
for (int i = 0; i < matches.Count; i++)
{
string Src = matches[i].ToString();
if (!Src.Contains("/>"))//是否是闭合标签
{
Src = Src.Replace(">", "/>");
}
XmlNodeList xnl = GetNoteList(Src, "//img");
if (xnl.Count > 0 && !string.IsNullOrEmpty(xnl[0].Attributes["src"].Value))
{
imgs[i] = xnl[0].Attributes["src"].Value;
}
}
return imgs;
}
private XmlNodeList GetNoteList(string xmlText, string tag)
{
XmlDocument xDoc = new XmlDocument();
xDoc.Load(new System.IO.MemoryStream(System.Text.Encoding.GetEncoding("UTF-8").GetBytes(xmlText)));
return xDoc.SelectNodes(tag);
}
}
}
using System.Collections.Generic;
namespace Common.NetJson
{
public class JsonResult
{
/// <summary>
/// 构造函数
/// </summary>
/// <remarks>设置变量默认值</remarks>
public JsonResult()
{
total = 0;
success = false;
msg = string.Empty;
rows = new List<object>();
children = new List<JsonResult>();
}
public JsonResult(string _id, string _text) { id = _id; text = _text; }
public int total { get; set; }
public bool success { set; get; }
public string msg { get; set; }
public object obj { set; get; }
public object rows { set; get; }
public string id { get; set; }
public string text { get; set; }
public List<JsonResult> children { get; set; }
}
/// <summary>
/// datatables 表格插件返回JSON数据格式
/// </summary>
public class dtJson
{
public int draw { get; set; }
public int recordsTotal { get; set; }
public int recordsFiltered { get; set; }
public object data { get; set; }
}
}
再解释下其中的重点吧。
if (!Src.Contains("/>"))//是否是闭合标签
{
Src = Src.Replace(">", "/>");
}
html标签闭合有两种
1、<div></div>第一种
2、<img src="#" alt="Alternate Text" />第二中
如果
Src取出的img标签不是闭合标签,vs就会抛异常。
跨域问题
public IEnumerable<string> Get()//解决跨域问题
{
return new string[] { "value1", "value2" };
}
为什么要写下面这方法
public IEnumerable<string> Get()//解决跨域问题
首先百度上说在web.cofing文件中加Access-Control-Allow-Origin :*,然而不管在IIs中加还是在web.cofing中加,发送的ajax请求都在报跨域请求什么什么 Access-Control-Allow-Origin 与什么 不匹配(null),的错。
好吧,我决定从vs创建web api给的例子中找原因。(我也不知道找没找到)
就跟着它写咯,艹,擦。之前百度一个说是什么,发送ajax请求时,浏览器会自动发送一个options什么东西。
难度还真这样?(待解!)
3、写完上面的就开始测试了
routeTemplate: "api/{controller}/{action}/{id}"
routeTemplate: "api/{controller}/{action}/{id}",
所以访问的地址就是
http://你的地址/Api/GetImages(控制器名)/Images(方法名)?Key=kaishi(值) (Images方法没加[HttpGet]、或[HttpPost],默认post发送请求)
4、页面上的浏览
<div class="flow-default" id="LAY_demo1" style="overflow-y:auto;height:700px;">
容器
</div>
flow.load({
elem: '#LAY_demo1' //流加载容器
, scrollElem: '#LAY_demo1'
, isAuto: true
, mb:100
, done: function (page, next) { //执行下一页的回调
//数据插入
setTimeout(function () {
var lis = [];
var Arry;
if (images() != "") {
Arry = images();//艹、擦,同步,异步的问题
$.each(Arry, function (i, obj) {
lis.push('<div style="width:50%;height:200px;float:left;background:#fff;border:1px solid aqua;"><img style="width:50%;height:200px;" src="' + obj + '" alt="图片来至于http://photo.sina.com.cn/" /></div > ');
});
} else {
for (var i = 0; i < 5; i++) {
lis.push('<div style="width:50%;height:200px;float:left;background:green;"></div > ');
}
}
//执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多
next(lis.join(''), page < 10); //假设总页数为 10
}, 500);
}
});
function images() {
var a = [];
$.ajax({
url: 'http://192.168.0.104:88/Api/GetImages/Images?Key=kaishi',
dataType: "json",
cache: false,
data: {},
type: "post",
async: false,
success: function (data) {
try {
a = JSON.parse(data).rows;
} catch (e) {
throw e;
}
}
});
return a;
}
重点,注意这里ajax发送请求使用 同步发送(等数据返回后再继续执行下去,不会的网页打debugger 调试),
效果是,
睡觉,不懂的再问吧,反正我很菜在实习。