使用中产生的困惑和问题,请指教

EricLiang 2012-06-09
直入正题,最近几天在看rop框架,设计思路很好。有几个问题向stamen和各位请教:
1、现在对请求方式没有要求,post或get都一样,是否有对考虑请求方式限定,例如有的API只能用post请求。
2、有些API的请求参数包含安全信息,是否有考虑支持https方式请求
3、针对每一次请求API时,都要封装一个RopRequest和RopResponse对象,这两个对象能否整合在一起,比如有一场景用来查询手机归属地,很容易写出这样的对象
public class PhoneNumber   {
    private String phoneNumber;    //手机号码
    private String location;//归属地
    private String carrier; //运营商
    private String brand;  //子品牌,如全球通
    private String online;//是否在网
    //getter and setter
    
}

这个对象就是对手机号码带有的属性进行封装。请求对象和响应对象如果能够整合,则phoneNumber属性可以作为请求参数,其他属性作为响应参数,不必写出两个对象了。
类似的例子还有:查询商品,请求为商品的条形码属性,响应为商品对象(包含名称、价格、产地...),而条形码也是商品对象的属性之一。

4、校验的问题,这个跟框架关系不是很大。目前框架校验用的是hibernate validator(JSR-303标准),有个问题不知道能否用此框架解决,还是用场景说明:
假如我开放了一个天气预报的API,请求参数是城市名称区号城市全拼,请求校验是城市名称、区号、城市全拼三者之一不为空这个的校验规则。是否需要对hibernate validator进行自定义校验。

5、Interceptor的问题
  我在运行时,Interceptor好像一直没有起作用。示例中ReservedUserNameInterceptor用来拦截userName=jhonson,但是拦截的日志倒是有输出,只是没有阻止请求,不知大家是不是这样的。在springMVC中Interceptor是用拦截方法的boolean判读的,而Rop框架用的是void.

总体来说框架很不错,特别是请求鉴权,越来越接近springMVC了,用了很多模式,扩展起来很容易的。
stamen 2012-06-11
首先,非常感谢你这样认真的使用者,你的认真是推动Rop前进的动力。下面,我来回答一下你的问题:
EricLiang 写道
直入正题,最近几天在看rop框架,设计思路很好。有几个问题向stamen和各位请教:
1、现在对请求方式没有要求,post或get都一样,是否有对考虑请求方式限定,例如有的API只能用post请求。


我正在改的版本已经支持了,不过只支持POST及GET,其它的我们不支持了,觉得没有什么必须,PUT,DELETE可以通过method进行区分。


引用

2、有些API的请求参数包含安全信息,是否有考虑支持https方式请求


这个和框架本身应该没有什么关系吧,是传输层的问题,这个我找时间试一下。


引用

3、针对每一次请求API时,都要封装一个RopRequest和RopResponse对象,这两个对象能否整合在一起,比如有一场景用来查询手机归属地,很容易写出这样的对象
public class PhoneNumber   {
    private String phoneNumber;    //手机号码
    private String location;//归属地
    private String carrier; //运营商
    private String brand;  //子品牌,如全球通
    private String online;//是否在网
    //getter and setter
    
}

这个对象就是对手机号码带有的属性进行封装。请求对象和响应对象如果能够整合,则phoneNumber属性可以作为请求参数,其他属性作为响应参数,不必写出两个对象了。
类似的例子还有:查询商品,请求为商品的条形码属性,响应为商品对象(包含名称、价格、产地...),而条形码也是商品对象的属性之一。


现在的新版本(正在写单元测试,完了我提交上去),我已经将RopResponse和RopRequest都改为接口了,你完全可以让一个类实现这两个接口。


引用

4、校验的问题,这个跟框架关系不是很大。目前框架校验用的是hibernate validator(JSR-303标准),有个问题不知道能否用此框架解决,还是用场景说明:
假如我开放了一个天气预报的API,请求参数是城市名称区号城市全拼,请求校验是城市名称、区号、城市全拼三者之一不为空这个的校验规则。是否需要对hibernate validator进行自定义校验。


这个要看JSR303本身是不是支持,JSR303的限制注解是可以扩展的,不过一个最简单的办法是在服务方法中把这个校验逻辑业务化处理。

引用

我在运行时,Interceptor好像一直没有起作用。示例中ReservedUserNameInterceptor用来拦截userName=jhonson,但是拦截的日志倒是有输出,只是没有阻止请求,不知大家是不是这样的。在springMVC中Interceptor是用拦截方法的boolean判读的,而Rop框架用的是void.


你可以在Interceptor中往RequestContext设置RopResponse阻止往下运行,Rop是通过判断RequestContext是否有RopResponse决定是否往下走的


现在Rop的文档没有写,所以会有这些问题,我会在这两周内把Rop的文档写出来,请关注。


EricLiang 2012-06-11
感谢回答,原来我的问题你都有考虑
我们95%以上的请求都是get和post就此两种足矣,虽然REST协议支持6种,其实也不必要了(目前看来)。
https协议我不太了解,可能问题有点外行了
Interceptor的问题:
示例中的代码:
if("jhonson".equals(methodContext.getParamValue("userName"))){
          
            InterceptorResponse response = new InterceptorResponse();
            response.setTestField("the userName can't be jhonson!");
            methodContext.setRopResponse(response);
        }

执行到这里 RequestContext对象(methodContext)的属性RopResponse已经有值了,可 是响应内容却
{"createUserResponse":{"userId":"1","createTime":"20120101010101","foo":{"field1":"1","field2":"2"}}}

说明执行了业务方法,没有拦截成功
stamen 2012-06-11
EricLiang 写道
感谢回答,原来我的问题你都有考虑
我们95%以上的请求都是get和post就此两种足矣,虽然REST协议支持6种,其实也不必要了(目前看来)。
https协议我不太了解,可能问题有点外行了
Interceptor的问题:
示例中的代码:
if("jhonson".equals(methodContext.getParamValue("userName"))){
          
            InterceptorResponse response = new InterceptorResponse();
            response.setTestField("the userName can't be jhonson!");
            methodContext.setRopResponse(response);
        }

执行到这里 RequestContext对象(methodContext)的属性RopResponse已经有值了,可 是响应内容却
{"createUserResponse":{"userId":"1","createTime":"20120101010101","foo":{"field1":"1","field2":"2"}}}

说明执行了业务方法,没有拦截成功


好的 我明天检查一下。
Global site tag (gtag.js) - Google Analytics