在Finagle中设置HTTP GET参数

时间:2013-08-14 02:51:40

标签: finagle

在Finagle中,如何以安全,干净的方式创建带有参数的HTTP GET请求请求?

val request = RequestBuilder()
  .url("http://www.example.com/test")
  .addParameter("key", "value")   // this doesn't exist
  .buildGet()
request    // should be a GET request for http://www.example.com/test?key=value

3 个答案:

答案 0 :(得分:7)

您可以使用容易混淆的Request.queryString

val request = RequestBuilder()
  .url(Request.queryString("http://www.example.com/test", Map("key" -> "value"))
  .buildGet()

答案 1 :(得分:2)

传递给RequestBuilder.url()的参数预计会完全形成,因此Finagle没有提供任何方法来处理更多查询参数。

解决此问题的一种方法是在RequestBuilder链的上下文之外构造一个URL对象。您可以在Map中定义查询参数,将其转换为查询字符串,然后将其连接到基本URL:

val paramStr = Map("key" -> "value", ...) map { case (k, v) =>
  k + '=' + v
} mkString("?", "&", "")

val request = RequestBuilder.safeBuildGet(
  RequestBuilder.create()
    .url("http://www.example.com/test" + paramsStr)
)

请注意,您需要对在Map

中指定的任何查询参数进行编码

答案 2 :(得分:-1)

您可以通过以下方式安全地创建请求:

import java.net.URL
import com.twitter.finagle.http.{Http, RequestBuilder}

val request = RequestBuilder()
             .url(new URL("http://www.example.com/test?key=value"))
             .setHeader("Content-Type", "application/json") //if you need
             .buildGet()