美文网首页
moco代码赏析一

moco代码赏析一

作者: hopelty | 来源:发表于2018-01-25 20:38 被阅读0次

    本次主要是赏析作者的第一次提交intialized project,这次提交主要把项目的雏形搭建起来和单元测试两部分内容。


    先从项目的组织框架来看,项目共有八个类,其中Moco类是入口,有server()方法和running()方法,server()方法的作用是新创建一个MocoServer对象并返回,running()方法则是启动该MocoServer对象。MocoServer类是服务器类,有启动、停止、response等方法。MocoHandler类继承了SimpleChannelHandler类,重写了messageReceived()方法,当收到request后,负责把RequestSetting写入response返回。RequestSetting、BaseRequestSetting、AnyRequestSetting、URIRequestSetting、ContentRequestSetting这五个类的关系如下:

    image

    其中三个RequestSetting实现类是针对不同的request输入类型或不同的请求方式,所做的三种不同的处理方法。


    下面看一些具体的代码,

        public void response(String response) {
            new AnyRequestSetting(this).response(response);
        }
    
        public BaseRequestSetting withContent(String requestContent) {
            return new ContentRequestSetting(this, requestContent);
        }
    
        public BaseRequestSetting withUri(String uri) {
            return new UriRequestSetting(this, uri);
        }
    

    这三个方法分别对应Request中的三种不同的输入或请求方式:get请求、post请求、输入为uri(addrA/addrB)。根据不同的输入,new出来不同的RequestSetting对象装入response中。

    RequestSetting的五个类中多次运用了多态,如:RequestSetting中的addToServer()抽象方法,在BaseRequestSetting中得到了重写、BaseRequestSetting中match()方法是个抽象方法,三个实现类分别重写了这个方法,拥有了针对不同的输入的不同处理方法。

        public abstract boolean match(HttpRequest request);
    
        public boolean match(HttpRequest request) {
            return true;
        }
    
        public boolean match(HttpRequest request) {
            long contentLength = HttpHeaders.getContentLength(request);
            ChannelBuffer contentBuffer = request.getContent();
            String content = contentBuffer.toString((int) (contentBuffer.capacity() - contentLength), (int) contentLength, Charset.defaultCharset());
    
            return content.equals(this.content);
        }
    
        public boolean match(HttpRequest request) {
            return (request.getUri().equals(uri));
        }
    

    在这版代码中,由于下两段代码中的isMatchAny被作者在三个RequestSetting的实现类中均置为false,所以有两部分代码是不会被访问的。我想作者这么做一定是有意为之,目的是为了针对不同的业务需求而做更好的扩展,且等日后继续看后面的代码~

        if (requestSetting.isMatchAny()) {
            this.anyRequestSetting = requestSetting;
        }
    
        if (anyRequestSetting != null) {
            channel.write(createResponse(anyRequestSetting));
        } else {
            channel.write(new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.BAD_REQUEST));
        }
    

    相关文章

      网友评论

          本文标题:moco代码赏析一

          本文链接:https://www.haomeiwen.com/subject/zfhbaxtx.html