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)
}

クライアント (ツイッター/フィナグル):

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.

もちろん、ヘルパー メソッドを使用する代わりに、 and を使用URIしてエンコードすることもできます。QueryStringEncoder

とはいえ、より高いレベルでそれを行いたい場合は、Finagle の上にあるこれらのライブラリのいずれかを使用できます。

于 2015-03-20T15:04:48.490 に答える