moco代码赏析八

今天来看一下2012.11.7的前四次提交,在下一篇中再聊那天的后五次提交。


首先来看第一次提交,这一次提交主要完成了MocoHttpServer类中的get()方法,这个方法的作用是指定了请求的方法只可以是get(),否则不能正确返回值。并且新写了一个类,HttpMethodRequestMethod类,它实现了RequestMatcher接口。

    server.get(by(uri("/foo"))).response(text("bar"));
    public Setting get(RequestMatcher matcher) {
        return request(and(new HttpMethodRequestMethod(), matcher));
    }
    public class HttpMethodRequestMethod implements RequestMatcher {
        @Override
        public boolean match(HttpRequest request) {
            return HttpMethod.GET.equals(request.getMethod());
        }
    }

上面的代码已经展示了作者是如何实现这个功能的,由MocoHttpServer的server对象来调用,把get()方法转换成一个matcher,和传入的matcher参数是and的关系。需要match的是,首先是否使用的是get()方式来请求。第二,是否能够match得上传入的matcher参数。

作者在第三次提交中,以相同的方式,实现了post()方式来请求,代码如出一辙,不必赘述。

第二次提交是对测试类做了一次重构。

第四次提交新加了一个Header类,顾名思义就是可以在post请求时加入header。与之对应的,就需要加入一个HeaderRequestMatcher类,重写match()方法。

    server.request(eq(header("foo"), "bar")).response("blah");
    public static Header header(String header) {
        return new Header(header);
    }
    public static RequestMatcher eq(Header xpath, String expected) {
        return new HeaderRequestMatcher(xpath, expected);
    }
    public class Header {
        private String header;
    
        public Header(String header) {
            this.header = header;
        }
    
        public String getHeader() {
            return header;
        }
    }
    public class HeaderRequestMatcher implements RequestMatcher {
        private final Header header;
        private final String expected;
    
        public HeaderRequestMatcher(Header header, String expected) {
            this.header = header;
            this.expected = expected;
        }
    
        @Override
        public boolean match(HttpRequest request) {
            return expected.equals(request.getHeader(header.getHeader()));
        }
    }

我们可以看到当请求时传入的header的Key-Value pair和我们第一部分代码传入的相同时,match()方法才能返回true。

你可能感兴趣的:(moco代码赏析八)