【发布时间】: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