1

我开始使用 Finagle 服务器 (twitter/finagle):

import com.twitter.finagle.{Http, Service}
import com.twitter.util.{Await, Future}
import java.net.InetSocketAddress
import org.jboss.netty.handler.codec.http._

object Server extends App {
  val service = new Service[HttpRequest, HttpResponse] {
    def apply(req: HttpRequest): Future[HttpResponse] =
      Future.value(new DefaultHttpResponse(
        req.getProtocolVersion, HttpResponseStatus.OK))
  }
  val server = Http.serve(":8080", service)
  Await.ready(server)
}

客户(推特/finagle):

import com.twitter.finagle.{Http, Service}
import com.twitter.util.{Await, Future}
import java.net.InetSocketAddress
import org.jboss.netty.handler.codec.http._

object Client extends App {
  val client: Service[HttpRequest, HttpResponse] =
    Http.newService("localhost:8080")
  val request =  new DefaultHttpRequest(
    HttpVersion.HTTP_1_1, HttpMethod.GET, "/")
  val response: Future[HttpResponse] = client(request)
  response onSuccess { resp: HttpResponse =>
    println("GET success: " + resp)
  }
  Await.ready(response)
}

如何将数据Map("data_id" -> 5)从客户端发送到服务器?我在服务器的哪个位置收到它?我必须向服务器添加回调吗?

我通过搜索没有找到它。如果你能给我一个例子的链接,那就足够了。

4

1 回答 1

3

Finagle 是一个非常精简的库。这意味着您必须自己处理大部分“魔法”。

为了使用来自客户端的参数发出请求,我使用这些辅助方法:

  def buildUri(base: String, path: String, params: Map[String, String] = Map.empty): String = {
    val p = if (params.isEmpty) ""
    else params map { case (k,v) => urlEncode(k) + "=" + urlEncode(v) } mkString ("?", "&", "")
    base + path + p
  }

  def urlEncode(url: String): String = URLEncoder.encode(url, "UTF-8")

然后我这样称呼它:

val url = buildUri(baseAddress, path, defaultParams ++ params)
val req = RequestBuilder().url(url).setHeader("Accept", "*/*").buildGet
client(req)

至于服务器,您必须做基本相同的事情并手动解析参数。使用java.net.URI或什至org.jboss.netty.handler.codec.http.QueryStringDecoder.

当然,您也可以使用URIandQueryStringEncoder来进行编码,而不是使用我的辅助方法。

也就是说,如果您想在更高级别上执行此操作,可以使用 Finagle 上方的以下库之一:

于 2015-03-20T15:04:48.490 回答