2016-08-10 5 views
0

Я хочу написать две службы, а затем использовать orElse, чтобы объединить две службы, что означает service_one или service_two. Все они PartialFunctions.Что такое правильный способ использования оператора илиElse в Scala?

Служба одно:

val usersService = HttpService { 
case request @ GET -> Root/"users"/IntVar(userId) => 
    Ok("test") 
} 

Служба два является:

val versionService = HttpService{ 
    case req @ GET -> Root/"version" => { 
    val jsonmap = ("origin" -> req.remoteAddr.getOrElse("unknown ip")) 
    Ok(compact(render(jsonmap))) 
    } 
} 

, а затем я хочу, чтобы объединить потом вместе.

val service = userService orElse versionService //the error happens here. 

Ошибка:

[error] F:\workspace\frankcheckAPI\src\main\scala\com\cardaccess\ServiceApp.scala:46: value orElse is not a member of org.http4s.HttpService 
[error] val service = usersService orElse versionService 
[error]       ^
[error] one error found 
[error] (compile:compileIncremental) Compilation failed 

Как совместить затем сделать то работает, как если случай соответствует пути первого сервиса Первой работы службы, если дело соответствует пути второго сервиса. вторая служебная работа.

пс: а неравнодушные люди:

объект

HTTPService это определить, как:

type HttpService = Service[Request, Response] 
    object HttpService { 

/** Alternative application which lifts a partial function to an `HttpService`, 
    * answering with a [[Response]] with status [[Status.NotFound]] for any requests 
    * where the function is undefined. 
    */ 
def apply(pf: PartialFunction[Request, Task[Response]], default: HttpService = empty): HttpService = 
    Service.lift(req => pf.applyOrElse(req, default)) 
... 
} 
+0

Что такое обслуживание? Какую структуру вы используете? –

ответ

4

orElse используется с PartialFunction, например:

val t1: PartialFunction[Int, String] = {case 1 => "I am 1"} 
val t2: PartialFunction[Int, String] = {case 2 => "I am 2"} 
val t = t1 orElse t2 
t(1) 
> I am 1 
t(2) 
> I am 2 

Как HttpService Применить метод подписи принять PartialFunction, я думаю, вы можете это сделать, может быть:

val usersService: PartialFunction[Request, Task[Response]] = { 
    case request @ GET -> Root/"users"/IntVar(userId) => 
    Ok("test") 
} 

val versionService: PartialFunction[Request, Task[Response]] = { 
    case req @ GET -> Root/"version" => { 
    val jsonmap = ("origin" -> req.remoteAddr.getOrElse("unknown ip")) 
    Ok(compact(render(jsonmap))) 
    } 
} 
val service = HttpService { 
    usersService orElse versionService 
} 
+0

Я добавил объект HttpService. @chengpohi – user504909

+0

@ пользователь504909, хороший, добавить пример. – chengpohi

+0

Не думайте, что эта «служба» работает, так как «userService» и «versionService» не являются PartialFunctions, а экземплярами Service. –