c#的客户端,向django 获取数据,并分页
最近忙完手头的工作,刚好有时间,便尝试捣鼓C# 上面wpf的开发,并用Prism来实现MVVM的结构。想想自己已经接近40,却还在捣鼓代码,有时候觉得这个似乎不太真实。可是软件开发一直是自己的业余爱好,再加上自己的工厂里一直都要使用,于是还是把业余时间投入了进去,不管这些时间值得与否,我还是想在优快云上面和朋友们分享一下。
就是实现标题里这个简单的目的
第一步,建立一个查询小类
class QueryRoll {
public string type;
public string pkgby;
public string status;
public int page_size=10;
public int which_page =1;
}
第二步 把查询对象发送到服务器
我使用了System.Net.WebClient这个工具,向我的Django数据库发送信息。
第三步 服务器接收到客户端发过来的json请求,然后通过设定好的查询条件,按照固定的json格式,把信息以json的格式反馈给客户端。
第四步,客户端收到json格式的数据,用JObject解析后,按照字段取出JToken,然后遍历,并生成我们想要的对象组。
以前我觉得用ADO.net会更方便,我们客户端直接连接数据库就行了,为什么要这么繁琐呢?用现在客户端访问Restful服务器的方式,我觉得一来服务器代码设计一次,所有客户端,无论手机,电脑,pad都可以通用,二来速度似乎比直接连接数据库更快,不知道是否我的错觉。
以下是客户端的代码
public List<Roll> fetchRolls(int page) {
List<Roll> rolls=new List<Roll>();
//访问服务器
string url = gServerUrl + "/roll/list/";
var json_data = string.Empty;
using (var webclinet = new System.Net.WebClient()) {
//设置编码
webclinet.Encoding = System.Text.Encoding.UTF8;
//设置数据发送方式
webclinet.Headers.Add(HttpRequestHeader.ContentType, "application/json");
try
{
//创建查询对象
QueryRoll qo = new QueryRoll();
qo.packageBy = 100;
qo.page_size = 10;
qo.which_page = page;
json_data = webclinet.UploadString(url, "POST", JsonConvert.SerializeObject(qo));
Debug.WriteLine(json_data)
JObject rollJson = JObject.Parse(json_data);
int count = Convert.ToInt32(rollJson["count"]);
int num_pages = Convert.ToInt32(rollJson["num_pages"]);
if (count > 0)
{
IList<JToken> rollTokens = rollJson["data"]["results"].Children().ToList();
foreach(JToken rt in rollTokens)
{
Roll r = rt.ToObject<Roll>();
rolls.Add(r);
}
}
}
catch (System.Net.WebException)
{
}
}
return rolls;
}
以下是Django服务器的主要代码
@api_view(['GET','POST','DELETE'])
def list_rolls(request):
if request.method=='POST':
logging.debug(request.body)
query_str=json.loads(request.body)
rolls_all=OdmRoll.objects.filter(packageby__exact=100)
page_size=int(query_str['page_size'])
which_page=int(query_str['which_page'])
pages=Paginator(rolls_all,10,page_size)
try:
rolls=pages.page(which_page)
except EmptyPage:
rolls=pages.page(1) #如果which_page超过总页数,直接返回第一页
rolls_serialized=RollSerializer(rolls,many=True)
print(rolls_serialized.data)
return JsonResponse({'message':'获取成功','count':pages.count,'num_pages':pages.num_pages,'data':{'results':rolls_serialized.data}},status=status.HTTP_200_OK)