【问题标题】:Restlet Post Request does not provide JSON data passedRestlet Post Request 不提供传递的 JSON 数据
【发布时间】:2013-05-23 19:23:11
【问题描述】:

我正在使用 Restlet 2.1.2 并且遇到一个异常问题,即我的请求表示文本为空。我查看了论坛并读到该实体是瞬态的,如果没有正确缓存,它将被销毁,但是虽然我有一个提供安全保障的警卫,但它并没有触及我所知道的实体。更有趣的是,对于一个路由 /authenticate,它只检查用户是否可以通过身份验证,可以获取实体文本,一个 JSON 对象。但是,当 /account/create 的代码运行时,两个使用 @Post("json:json") 的 post 请求,我都无法发送 JSON 数据。下面我添加了我的代码和我发出的示例 curl 语句。有关结果,请参见 AuthenticationResource 和 Account Resource 类。

public class Executable{

    public static void main(String[] args) throws Exception{
        Component com = new Component();
        com.getServers().add( Protocol.HTTP,  8182 );
        com.getDefaultHost().attach( "/myapi", new RoutingApp() );
        com.start();  
    }
}

public class RoutingApp extends Application {

    public RoutingApp() {
        super();
    }

    @Override  
    public synchronized Restlet createInboundRoot() { 

        Context context = getContext();
        Router router = new Router(context);

        router.attach( "/account/create", AccountResource.class );
        router.attach( "/authenticate", AuthenticationResource.class );

        ChallengeAuthenticator authenticator = new ChallengeAuthenticator( 
                context, ChallengeScheme.HTTP_BASIC, "myapi" );

        MySecretVerifier verifier = new MySecretVerifier();
        MyEnroler enroler = new MyEnroler();
        authenticator.setVerifier( verifier );
        authenticator.setEnroler( enroler );

        MyAuthorizer authorizer = new MyAuthorizer();
        authorizer.setNext( router );

        authenticator.setNext( authorizer );

        return authenticator; 
    }
}

public class MySecretVerifier extends SecretVerifier {

    @Override
    public int verify( String identifier, char[] secret ) {

       [... Get User by identifier ...]

       if( [... Check User Secret ...] ) {
           Request request = Request.getCurrent();
           request.getAttributes().put( "currentUser", user );
           return SecretVerifier.RESULT_VALID;
       } else {
           return SecretVerifier.RESULT_INVALID;
       }
    }
}

public class MyEnroler implements Enroler {

    @Override
    public void enrole(ClientInfo ci) {

        Request request = Request.getCurrent();
        User user = (User) request.getAttributes().get( "currentUser" );

        if( null != user ) {

            [... Get User Roles ...]

            for( [... Each Role ...] ) {
                Role role = newRole( r.name, "" );
                ci.getRoles().add( role );
            }
        }
    }
}

public class MyAuthorizer extends Authorizer {

    @Override
    protected boolean authorize( Request request, Response response ) {

        ClientInfo info = request.getClientInfo();
        Method method = request.getMethod();
        User user = (User) request.getAttributes().get( "currentUser" );
        String uri = request.getResourceRef().getRemainingPart( true, false );
        List<Role> userRoles = info.getRoles();

        boolean authorized = false;

        if( [... Check if User is Authorized ...] ) {
            request.getAttributes().putAll( [... add some properties from a HashMap ...] );
            authorized = false;
        }

        return authorized;
    }
}

public class AuthenticationResource extends ServerResource {

    @Post("json:json")
    @Override
    public String performPost(Representation entity) {

        Request request = Request.getCurrent();

        request.getEntityAsText();     //returns { "id" : "larry", "secret" : "test" }
        request.getEntity().getText(); //returns null
        entity.toString();                  //returns [application/json]
        entity.getText();                  //returns null
    }
}

public class AccountResource extends ServerResource {

    @Post("json:json")
    @Override
    public String performPost( Representation entity ) {

        Request request = Request.getCurrent();

        request.getEntityAsText();     //returns null
        request.getEntity().getText(); //returns null
        entity.toString();                  //returns [application/json]
        entity.getText();                   //returns null
    }
}

我的 CURL 语句如下:

curl -i --user larry:test -H "Content-Type: application/json" -X POST -d '{ "id" : "larry", "secret" : "test" }' http://localhost:8182/myapi/account/create
curl -i --user larry:test -H "Content-Type: application/json" -X POST -d '{ "id" : "larry", "secret" : "test" }' http://localhost:8182/myapi/authenticate

【问题讨论】:

    标签: java api restlet restlet-2.0


    【解决方案1】:

    如果其他人遇到类似问题,问题实际上是“AccountResource”类的名称。我不知道为什么,但我只能假设它与导致问题的 Restlet 中内置的 AccountResource 接口有关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 2023-03-19
      • 2014-01-10
      • 2021-08-19
      • 1970-01-01
      • 2023-03-23
      • 2020-06-23
      相关资源
      最近更新 更多