2016-11-03 2 views
1

Ich habe 2 einfache APIs:Wie Proxy eine HTTP-Methode mit Play Framework 2.5?

GET  /users/me/photos  controllers.api.UserController.getMyPhotos 
GET  /users/:userId/photos controllers.api.UserController.getPhotos(userId: Int) 

Hier getPhotos:

def getPhotos(userId: Int) = SecuredAction.async { 
    logger.info(s"Searching for user $userId's photos") 

    userPhotosRepo.findByUserId(userId).map { 
    photos => Ok(Json.toJson(photos)) 
    } 
} 

hier getMyPhotos:

def getMyPhotos = SecuredAction.async { request => 

    request.identity.id.map { currentUserId => 
    logger.info(s"Searching for current user's photos") 

    getPhotos(currentUserId) // doesn't work 
    }.getOrElse(Future.successful(InternalServerError)) 
} 

Wie kann ich getMyPhotos Proxy durch getPhotos, ohne eine Hilfsmethode machen sie beide anrufen?

+0

Was ist der Fehler zurückgegeben? Ich denke, dass Ihr Code funktionieren sollte (der Code in SecuredAction wird zweimal aufgerufen, einmal für 'getMyPhotos' und einmal für' getPhotos') – vdebergue

Antwort

1

Hier können Sie Rückleitung von Play-Framework zur Verfügung gestellt verwenden

[full package].routes.[controller].[method] 

In Ihrem Fall

routes.api.UserController.getPhotos(request.identity.id) 

Wenn Sie das Ergebnis der ersten Aktion wollen

val ans: Result = Redirect(routes.api.UserController.getPhotos(request.identity.id)) 

Ich hoffe, das ist, was du hast versucht zu fragen.

EDIT:

Für Ihre Sorge sollte dies eine richtige Art und Weise, es zu tun

def getPhotos(userId: Long) = SecuredAction.async { 
    userPhotosRepo findByUserId(userId) map { 
    photos => Ok(Json.toJson(photos)) 
    } 
} 

def getMyPhotos = SecuredAction.async { request => 
    request.identity.id map { id => 
     Redirect(routes.HomeController.getPhotos(id)) 
    } 
} 
+0

Ich habe das gerade versucht, aber ich bekomme einen Fehler: 'play.sbt.PlayExceptions $ CompilationException : Kompilierungsfehler [Eine Instanz von play.api.mvc.Result kann nicht in die HTTP-Antwort geschrieben werden. Versuchen Sie ein Writeable zu definieren [play.api.mvc.Result]] ' Mein Code ist nur' Future.successful (Ok (Redirect (routes.UserController.getPhotos (currentUserId)))) '. Ich möchte nicht eine tatsächliche HTTP-Weiterleitung ausgeben, also nehme ich an, dass dies nur eine transparente interne Weiterleitung ist? – jbrown

+0

Welche Aktion möchten Sie in einer anderen Aktion aufrufen? - Ich nehme an, dass Sie getMyPhotos in getPhotos aufrufen möchten? - Wollen Sie eine Reaktion von einer Aktion in einer anderen? –

+0

Nein. 'GetMyPhotos' ist derjenige, der die ID des aktuellen Benutzers von seiner Authentifizierungsinformation abruft. Ich möchte dann nur das Ergebnis des Aufrufs von 'getPhotos (currentUserId)' von 'getMyPhotos' zurückgeben. Es ist nur eine bequeme Methode, damit der Client nicht wissen muss, wie die ID des angemeldeten Benutzers lautet. – jbrown

Verwandte Themen