Skip to content

Web Service Example Rus

dunnololda edited this page Aug 17, 2012 · 1 revision

Новое апи в Scage v0.9.1 позволяет делать синхронный запрос от клиента на сервер и наоборот - то есть, дожидаться ответа от противоположной стороны. Пример ниже демонстрирует использование этой фичи для построения простого вебсервиса.

import net.scage.support.net.{NetClient, NetServer}
import net.scage.support.State

object ScageWS extends App {
  /**
   * Sums two numbers
   *
   * @param a - first number to sum
   * @param b - second number to sum
   * @return sum of input parameters
   */
  def sum(a:Float, b:Float) = a + b

  NetServer.startServer(
    port = 9800,
    onClientQuestion = {(client, question) =>
      question.get("sum") match {
        case Some(State(("a", a:Float), ("b", b:Float))) => State("sum" -> sum(a, b))
        case None => State()
      }
    }
  )
}

object ScageWSClient extends App {
  NetClient.startClient(
    server_url = "172.16.0.19",
    port = 9800
  )

  def sum(a:Float, b:Float) = {
    val answer = NetClient.askServer(State("sum" -> State("a" -> a, "b" -> b)))
    answer.value[Float]("sum")
  }

  while(true) {
    val a = (math.random*100).toFloat
    val b = (math.random*100).toFloat
    val sum_value = sum(a, b)
    println(a + " + " + b + " = " + sum_value)
    Thread.sleep(1000)
  }
}

Вебсервис принимает два числа и возвращает клиенту их сумму. В приведенном примере клиент раз в секунду генерирует два числа, отсылает их серверу, принимает от него сумму и выводит ее в консоль.

Обмен сообщениями происходит по текстовому протоколу поверх TCP/IP. Стороны обмениваются сообщениями в формате json. Запрос выглядит так: {"sum":{"a":5, "b":6}} Ответ от сервера: {"sum":11}

Clone this wiki locally