2014-05-15 19 views
9

Bir RESTful API geliştirmek için Spray.io kullanırken, uygulamamı nasıl yapılandırmalıyım?Spray.io ile RESTful API nasıl yapılandırılır?

this answer'u bir Sprey uygulamasının nasıl bölüneceği konusunda çoktan gördüm, ancak "istek başına bir oyuncu" yaklaşımını kullanmadığı için memnun değilim. Kök aktörden gelen başvuruları yollara göre uygulamamdaki diğer aktörlere iletebilir miyim ve bu aktörlerin içinde ilgili yolları tanımlayabilir miyim?

Teşekkür

cevap

8

yapabilirsiniz yolları veya herhangi başka dayanan başka bir aktör kesinlikle ileri istekler. her bir hizmeti işlemek diğer aktörlerle tüm istekleri ve güzergahları bunları aldığı ana aktör

https://github.com/gangstead/spray-moviedb/blob/master/src/main/scala/com/example/routes/ApiRouter.scala

relavent kod: (örnek projesinin bir çatal çatal olan) benim örnek projemi inceleyin

def receive = runRoute { 
    compressResponseIfRequested(){ 
     alwaysCache(simpleCache) { 
     pathPrefix("movies") { ctx => asb.moviesRoute ! ctx } ~ 
     pathPrefix("people") { ctx => asb.peopleRoute ! ctx } 
     } ~ 
     pathPrefix("login") { ctx => asb.loginRoute ! ctx } ~ 
     pathPrefix("account") { ctx => asb.accountRoute ! ctx } 
    } 
    } 

Ve örnek filmler yol için :

def receive = runRoute { 
    get { 
     parameters('query, 'page ? 1).as(TitleSearchQuery) { query => 
     val titleSearchResults = ms.getTitleSearchResults(query) 
     complete(titleSearchResults) 
     }~ 
     path(LongNumber) { movieId => 
     val movie = ms.getMovie(movieId) 
     complete(movie) 
     }~ 
     path(LongNumber/"cast") { movieId => 
     val movieCast = ms.getMovieCast(movieId) 
     complete(movieCast)  
     }~ 
     path(LongNumber/"trailers") { movieId => 
     val trailers = ms.getTrailers(movieId) 
     complete(trailers)  
     }   
    } 
    } 
+0

Burada örneğinize bakıyordum ve CDI kullandığınızı farkettim. Kullanmayı neden seçtiğin belli bir sebep var mı? – EdMelo

+0

CDI ile bağımlılık enjeksiyonu mı kastediyorsunuz? – Gangstead

+0

Evet./* Stackoverflow daha fazla karakter gerektirir ... */ – EdMelo

0

ben ilk tam DİNLENME proje oluşturma ile çok mücadele edildi. Bulduğum örnekler merhaba dünya seviyesindeydi ... Birkaç blog okudum, birkaç yorum ve örnek proje oluşturmaya karar verdim. Bu skala/akka/sprey/mysql dayanmaktadır

Veri Sen Burada https://github.com/vixxx123/scalasprayslickexample

üzerine bunu kontrol edebilirsiniz vb değiştirildiğini müşterilerine bildirmek için WebSocket'e tam çalışma örneği olduğunu projeden yönlendirme örnek kod :

val personCreateHandler = actorRefFactory.actorOf(RoundRobinPool(2).props(Props[CreateActor]), s"${TableName}CreateRouter") 
val personPutHandler = actorRefFactory.actorOf(RoundRobinPool(5).props(Props[UpdateActor]), s"${TableName}PutRouter") 
val personGetHandler = actorRefFactory.actorOf(RoundRobinPool(20).props(Props[GetActor]), s"${TableName}GetRouter") 
val personDeleteHandler = actorRefFactory.actorOf(RoundRobinPool(2).props(Props[DeleteActor]), s"${TableName}DeleteRouter") 

val userRoute = 
    pathPrefix("person") { 
     pathEnd { 
      get { 
       ctx => personGetHandler ! GetMessage(ctx, None) 
      } ~ 
      post { 
       entity(as[Person]) { 
        entity => 
         ctx => personCreateHandler ! CreateMessage(ctx, entity) 
       } 
      } 
     } ~ 
     pathPrefix (IntNumber){ 
      entityId => { 
       pathEnd { 
        get { 
         ctx => personGetHandler ! GetMessage(ctx, Some(entityId)) 
        } ~ put { 
         entity(as[Person]) { entity => 
          ctx => personPutHandler ! PutMessage(ctx, entity.copy(id = Some(entityId))) 
         } 
        } ~ delete { 
         ctx => personDeleteHandler ! DeleteMessage(ctx, entityId) 
        } ~ patch { 
         ctx => personPutHandler ! PatchMessage(ctx, entityId) 
        } 
       } 
      } 
     } 
    } 

ve aktör işleyicisi oluşturmak örnek:

override def receive: Receive = { 

    case CreateMessage(ctx, person) => 

     val localCtx = ctx 
     connectionPool withSession { 
     implicit session => 
      try { 
      val resId = PersonsIdReturning += person 
      val addedPerson = person.copy(id = Some(resId.asInstanceOf[Int])) 
      localCtx.complete(addedPerson) 
      publishAll(CreatePublishMessage(TableName, localCtx.request.uri + "/" + addedPerson.id.get, addedPerson)) 
      L.debug(s"Person create success") 
      } catch { 
      case e: Exception => 
       L.error(s"Ups cannot create person: ${e.getMessage}", e) 
       localCtx.complete(e) 
      } 
     } 
    } 

Orada eksik iki önemli şeyler hala şunlardır: OAuth2 ve notifica itmek web kullanıcısı üzerinden belirli kullanıcı/bağlantı için

İlgili konular