我开始使用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)
}客户端(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 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)这样的数据从客户机发送到服务器?在服务器上我能收到它吗?我必须向服务器添加回调吗?
我没有通过搜索找到它。如果你能给我一个例子的链接,那就足够了。
发布于 2015-03-20 15:04:48
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。
当然,您也可以使用URI和QueryStringEncoder进行编码,而不是使用我的助手方法。
尽管如此,如果您想在更高的级别上这样做,您可以在Finagle上面使用以下库之一:
https://stackoverflow.com/questions/29166272
复制相似问题