葡京在线开户Android知识浅积累——Volley篇

#Q2 AppController.getInstance().addToRequestQueue(req);——NullPointerException

*
*

使AppController时出现空指针异常

NullPointerException

 AppController继承Application

Solution:

以manifest的application节点里添加如下一句:

android:name=”<packagename>.AppController”

在manifest里配置AppController 

 数据获得中。。。

=============================================

题目累积中-_-||。。。

葡京在线开户 1

Volley官方源码:

https://android.googlesource.com/platform/frameworks/volley/

Volley发布现场

点这图只是独出色被的小例子,实际支出状况是,可能一次性要传十几单字段甚至还多。

#Q1 Cannot resolve constructor ‘JsonObjectRequest…’

Cannot resolve constructor ‘JsonObjectRequest…’

Solution:

将JsonObjectRequest的参数”null”强转为String类型-_-||

 将null强转为String类型

纵使如下所示。

咱俩先来认一下Volley:

http://blog.csdn.net/jdsjlzx/article/details/40738181

how to get started

今,你生出一个MVC架构的web项目,你而形成一个挂号功能。

Google I/O 2013 – Volley: Easy, Fast Networking for Android视频

葡京在线开户 2

Volley在线帮助文档——

 Volley 在线帮助文档

http://afzaln.com/volley/

注:这同一步会生个知识点,叫做模型验证,不晓得的童鞋可以百度下,MVC会通过一定规则自动直接拿参数反序列化成所对应的实体类,但是以自这示例是webapi模式的,写法略有不同,所以还要在参数前加个[FromBody]才自动反序列化。

Android Studio如何导入Volley?

Gradle Scripts–>build.gradle,添加如下一行代码:

compile ‘com.mcxiaoke.volley:library:1.0.+’

要是图:现在公一旦当控制器里面判断,账号名称、密码、邮箱不克吧空,并且称与密码无越16位。

#Android网络框架Volley

至于实际怎么会自行反序列化,在本篇并无是自己如果讲话的主题,所以谢兴趣之童鞋可以百度下:MVC下之ModelBinder
   。

代码小困惑——

葡京在线开户 3

前台传了3独价值到公的控制器,分别是账号、密码、邮箱。

型验证进阶:自由支配欲征的字段

百度了瞬间,网上没有拖欠地方的科目,博客园中吗未曾找到,群里也未尝交流有个结实,但这种状况也不时碰到!

 梳理下思路,大致有几种,第一栽是用某种手段控制类中之这些验证特性,或者决定类吃的性能字段,如启用或停用,但是c#莫能够针对性能字段进行停止启用,而控制类中之这些证明特性也闹硌天方夜谭,本身即是微软查封装好的,你得反编译一下押下源码,然后重构?或者你直接不用这些框架封装好之征特性,使用好定义自定义说明特性,然后将控制措施还写以中?这样最好辛苦,而且违背初衷。自定义ModelBinder
?更扯。

一番折磨无果,那么即便非克自特性本身找突破口了,这时,我拿目标转移至ModelState.IsValid上,换一种思路实现。

葡京在线开户 4

咱发现其落实了GetEnumerator方法,于是对该进行遍历,可以落到特性所绑定的字段属性之称号与那状态。

盖只要兑现自由支配需要验证的字段,所以无论怎样实现,都只能通过
自定义特性 标注在方式体头上来实现。

倘优秀的最后表现效果应是这么的:

放图:

葡京在线开户 5

 

或者

 葡京在线开户 6

 

用方法:

一经艺术头上闹KeepZ特性的语,就进去自由支配验证字段状态。

 

[KeepZ(“字段1″,”字段2”)]  即:只针对  字段1
以及 字段2   进行认证

[KeepZ(false,”字段3″)]  即:除了  字段3
 外面,其余字段都开展求证

 

 

这就是说我们拖具体实现代码:

葡京在线开户 7

葡京在线开户 8

 

 public override void OnActionExecuting(HttpActionContext actionContext)
        {
            if ((actionContext.ActionDescriptor.ActionName.ToUpper().Contains("INSERT") || actionContext.ActionDescriptor.ActionName.ToUpper().Contains("CHECK") ||
                 actionContext.ActionDescriptor.ActionName.ToUpper().Contains("UPDATE")))
            {
                var ia = actionContext.ActionDescriptor.GetCustomAttributes<KeepZ>();
                if (ia.Count != 1)
                {
                    goto result;
                }
                foreach (KeyValuePair<string, ModelState> item in actionContext.ModelState.ToArray())
                {
                    if (ia[0].Modes == false)
                    {
                        foreach (string PropertysValue in ia[0].Propertys)
                        {
                            if (item.Key.Contains(PropertysValue))
                            {
                                actionContext.ModelState.Remove(item.Key);
                            }
                        }
                    }
                    else
                    {
                        bool re = false;
                        foreach (string PropertysValue in ia[0].Propertys)
                        {
                            if (item.Key.Contains(PropertysValue))
                            {
                                re = true;
                            }
                        }
                        if (re == false)
                        {
                            actionContext.ModelState.Remove(item.Key);
                        }
                    }
                }
                result: if (!actionContext.ModelState.IsValid)
                {

                    actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);


                }
            }
        }

/// <summary>
    ///  保持
    /// </summary>
    public class KeepZ : Attribute
    {
        public string[] Propertys = null;
        public bool Modes = true;
        public KeepZ(params string[] Property)
        {
            Propertys = Property;
        }
        public KeepZ(bool Mode, params string[] Property)
        {
            Propertys = Property;
            Modes = Mode;
        }
    }

如此一来,就无须再行重建Model这样费时费力的点子了,现在MVC架构大多都用这种验证模式,但是可从没
 自由选择验证字段的缓解方案,每每遇到该情况,只能无奈再度建个实体类,对比之下,根本没有食得这种拦截层模型验证的精粹,只套个模型,反而弄巧成拙不成本意,所以自己形容了此篇和豪门一起分享,加入了KeepZ来支配需要验证的字段,就是真的落实了
 可 复用  ,逻辑和拦截分层  了。

Demo虽略,但是这种状态下之缓解方案,我在博客园中从来不找到,应该是田园里第一篇吧。

在意,BindAttribute 这个特性,是 针对赋值上的拍卖, 选择赋值 和 选择验证
是 两个 看似相同却截然不同的星星只支行,本文是 自由支配验证拦截
,所适用性在好几场景要于 BindAttribute 要多,当然,不介意的语, 你吗得以
将 BindAttribute  带入本实例中,也是得的, 剔除验证的早晚 剔除赋值。

 

作者:小曾
出处:http://www.cnblogs.com/1996V/p/7423834.html 欢迎转载,但任何转载必须保留完整文章,在显要地方显示署名以及原文链接。如您有任何疑问或者授权方面的协商,请给我留言
.Net交流群, QQ群:166843154 欲望与挣扎 

拦截层的解耦

本,我觉得把实体类证被带至控制器里去写的这种办法有些不抖,如果工作规则基本上吧,那么这么的说明代码就好庞大,并且只要全勤项目都采用这种验证模式,那么当自我然后的维护阶段中就是展示有些臃肿的感到,实体类依赖让控制器方法去验证,我得先找到这个实体类,然后仔细揣摩有怎样措施用到了该实体类,又开了何等验证判断,然后保安。

那我力所能及免可知当控制器方法吃 验证实体类这等同步
给挪掉,不写到控制器的方式中,写以另一个地方,统一进行管制,实现实体类的说明和控制器中之法子业务逻辑分除。

这种行为操作有点像httpModule,思想齐虽是设计模式所谓的大跌耦合性了。

那么怎么开吗?

咱们得一直当实体类吃加验证,如图

葡京在线开户 9

点看到[Required],[StringLength],[RegularExpression]的这些名验证特性,是.net框架都封装好的,它见面针对标特性的字段采取验证。

[Required]范围了必须输入,[Required(ErrorMessage = “请输入用户名”)]  

[StringLength]克了规定的长短,[StringLength(10, ErrorMessage = “长度不能够跳10只字符”)]  

[Range]
限制了价值的限定,[Range(0, 120, ErrorMessage = “年龄范围在0到120东之间”)]  

[RegularExpression]
限制了要满足正则表达式,[RegularExpression(@”^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$”, ErrorMessage = “请输入Email格式”)]  

[Compare]限制了与的相应之字段相等,[Compare(“pwd”, ErrorMessage = “两软密码要一致”)]
 //该特性标注的字段值必须跟pwd字段值相等

.net也便封装了几乎独,这5独用底极端多(当然,也得打定义这种验证特性,对这块想深入了解之乞求百度:mvc
ValidationAttribute)。

那么自己标注了特征后什么进展判定也?

  

俺们看下控制器方法吃之写法:

葡京在线开户 10

假如图,用 ModelState.IsValid
 这段话来针对证明结果开展判定,如果实体类及的让标明的性状都满足条件的说话,就为true,否则也false。

那么,因为这种模型验证是种模式,是大局的,所以理应单独将出来在拦截层进行登记。

如图:

葡京在线开户 11

立马段代码的意思就是是:每当进入控制器方法之前,会判定是法的称谓,如果含有的来Insert、check、update这三者的任意一个,都见面进行拦验证(对范验证的结果进行判断),如果为false,那么即便回来给客户端一个400写态码。

下一场报一下:(注册的地方唯有是独范例,因为自是webapi,只针对http进行阻挠)

葡京在线开户 12

葡京在线开户 13

 

model负责填写规则,验证由特别的认证口去举行,逻辑由特别的逻辑人员去形容,这样就各司其职了。

 不过,这才不过是率先步!

(随着你习以为常的支付,你必会遇见这种情形)

user实体类,是专注于注册方式,说白了,就是为注册方式所勾画的,

我现还要写单登录方法。

可是登录的时刻,我莫需填写email,只需要填账号和密码,对立即半个字段进展验证。

然我之实业类中对email做了[Required]和[RegularExpression]征,那么如此虽导致了
如果自己报到方法继续应用这user实体类,那么肯定会报错,会回去个400检验证码。

这种场面我该怎么化解?难道又建个model?再又为一样整个规则?这尚独自只出3单字段,万一部分表中有十几只字段,二十几只字段甚至更多庸处置?

再也建个model肯定非常,这样已经失去了  
复用性、各司其职  的初衷。

求解决方案!在线等!

那当骨子里支出被,通常为复用性,我们用即刻3只参数用一个实体类来代替。