如何向Play2.2 Scala WS-GET添加消息正文?
我知道这是非常规的——我正在访问一个API,该API要求将JSON对象作为GET请求的消息体发布。使用Play 2.2.2和如何向Play2.2 Scala WS-GET添加消息正文?,scala,playframework,playframework-2.2,Scala,Playframework,Playframework 2.2,我知道这是非常规的——我正在访问一个API,该API要求将JSON对象作为GET请求的消息体发布。使用Play 2.2.2和Play.api.libs.ws.ws 我正在尝试将消息正文添加到WSRequestHolder。.post()方法允许这样做,但是.get()方法没有这样的参数。我正在考虑使用基本的WSRequest类,而不是WSRequestHolder,但不确定是否有更好的方法 Psuedo代码: WS.url(url.get(Json.obj(“参数”->“值”)) 或 WS.ur
Play.api.libs.ws.ws
我正在尝试将消息正文添加到WSRequestHolder
。.post()
方法允许这样做,但是.get()
方法没有这样的参数。我正在考虑使用基本的WSRequest
类,而不是WSRequestHolder
,但不确定是否有更好的方法
Psuedo代码:
WS.url(url.get(Json.obj(“参数”->“值”))
或
WS.url(url.setBody(Json.obj(“param”->“value”)).get()
有什么想法吗?谢谢你的帮助 当有疑问时,推出自己的解决方案
import scala.concurrent.{ Future, Promise }
import play.api.libs.concurrent._
import play.api.libs.iteratee._
import play.api.libs.iteratee.Input._
import play.api.libs.json._
import play.api.http.{ Writeable, ContentTypeOf }
import play.api.libs.ws.WS._
import play.api.libs.ws.{SignatureCalculator, Response}
import com.ning.http.client.Realm.AuthScheme
import com.ning.http.client.PerRequestConfig
class MyRequest(
url: String,
headers: Map[String, Seq[String]],
queryString: Map[String, Seq[String]],
calc: Option[SignatureCalculator],
auth: Option[Tuple3[String, String, AuthScheme]],
followRedirects: Option[Boolean],
requestTimeout: Option[Int],
virtualHost: Option[String]
) extends WSRequestHolder(url,headers,queryString,calc,auth,followRedirects,requestTimeout,virtualHost) {
/**
* Perform a GET on the request asynchronously with a body.
*/
def get[T](body: T)(implicit wrt: Writeable[T], ct: ContentTypeOf[T]): Future[Response] = prepare("POST", body).execute
/**
* Prepare a request
* @param method
* @param body
* @param wrt
* @param ct
* @tparam T
* @return
*/
override def prepare[T](method: String, body: T)(implicit wrt: Writeable[T], ct: ContentTypeOf[T]) = {
val request = new WSRequest(method, auth, calc).setUrl(url)
.setHeaders(Map("Content-Type" -> Seq(ct.mimeType.getOrElse("text/plain"))) ++ headers)
.setQueryString(queryString)
.setBody(wrt.transform(body))
followRedirects.map(request.setFollowRedirects)
requestTimeout.map {
t: Int =>
val config = new PerRequestConfig()
config.setRequestTimeoutInMs(t)
request.setPerRequestConfig(config)
}
virtualHost.map {
v =>
request.setVirtualHost(v)
}
request
}
}
object MyWS {
/**
* Prepare a new request. You can then construct it by chaining calls.
*
* @param url the URL to request
*/
def url(url: String): MyRequest = new MyRequest(url, Map(), Map(), None, None, None, None, None)
}