Restlet 2.1.2를 사용 중이고 요청한 텍스트가 null 인 대표 텍스트가 비정상적입니다. 포럼을 살펴본 결과 엔티티가 일시적이며 올바르게 캐싱되지 않으면 파손될 것이라고 읽었지만 보안을 제공하는 경비원은 알고있는 것처럼 엔티티에 손을 대지 않습니다. 좀 더 흥미롭게도 사용자가 인증받을 수 있는지를 확인하는 하나의 라우트/인증에 대해 엔티티 텍스트 인 JSON 객체를 얻을 수 있습니다. 그러나/account/create 코드가 실행될 때 @Post ("json : json")를 사용하여 두 요청을 모두 게시하면 JSON 데이터를 보낼 수 없습니다. 아래에 코드와 내가 발행 할 곱슬 문장을 추가했습니다. 결과에 대해서는 AuthenticationResource 및 Account Resource 클래스를 참조하십시오. 다음과 같이Restlet Post 요청이 전달 된 JSON 데이터를 제공하지 않습니다.
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