9

URLにPOSTし、クエリパラメータとヘッダーを設定し、本文に生の文字列を渡したい。次に、リクエストを実行して出力文字列を取得し、JSONに変換できるようにします。また、さまざまな種類のエラーに応答する(およびリダイレクトを処理する)例外処理が必要です

しかし、Dispatch 0.9は十分に文書化されておらず、文書化されたバージョンでAPIを壊し、非常に風変わりなので、完全な解決策を思い付くことができません。私は完全に立ち往生しているので、たくさんお願いします。


これが私が思いつくことができるすべてですが、クエリパラメータの設定は奇妙です:

val solr = host("localhost", 8983)
val req  = solr / "update" / "json" 
    setQueryParameters( Map( "commit" -> "true")) 
    setHeader( "Content-type", "application/json")
    setBody( a)

しかし、クエリパラメータを設定すると、難しいエラーが発生します。

<console>:14: error: type mismatch;
 found   : scala.collection.immutable.Map[java.lang.String,java.lang.String]
 required: com.ning.http.client.FluentStringsMap
       val req  = solr / "update" / "json"  setQueryParameters( Map( "commit" -> "true"))

HTTPS、リダイレクト、クエリパラメータ、ヘッダー、POSTメソッドなどのリクエストを完全に設定するのを手伝ってください。

また、リクエストを実行して本文(およびヘッダー)を取得し、応答コード(200、301、302、400、500)に応じて分岐するのを(同期して、そのようにしたいと思います)支援します。

4

2 に答える 2

15

あなたはそれほど遠くありません。リクエスト定義では、次のように機能するはずです。

import dispatch._

val params = Map("commit" -> "true")
val headers = Map("Content-type" -> "application/json")

val solr = host("localhost", 8983)

val req = solr / "update" / "json" << a <<? params <:< headers

または、操作性が低くなります。

val req = url("http://localhost:8983/update/json").POST
  .setBody(a)
  .addQueryParameter("commit", "true")
  .addHeader("Content-type", "application/json")

.secureHTTPSを使用する場合は、どこかにaをスローします。

次のようなpromise(基本的に遅延リクエスト操作の結果を表す)を取得できます。

val result = Http(req OK as.String).either

そして、次のように使用します。たとえば、次のようになります。

result() match {
  case Right(content)         => println("Content: " + content)
  case Left(StatusCode(404))  => println("Not found")
  case Left(StatusCode(code)) => println("Some other code: " + code.toString)
}

0.9のドキュメントがいくつかの場所でまばらであることに同意しますが、 promiseを使用して非同期要求操作を処理する方法について非常に役立つ説明を提供します。


OPの追加:このビットは私のためにこの答えを完成させます。これにより、単純なブロック方法で応答が得られます。

val response = Http(req)()
val body response.getResponseBody
于 2012-09-09T21:23:12.407 に答える
0

ディスパッチ0.9.1の単純なユースケースでPOSTを使用します。これは、次のように設定します。

val SERVICES_URL = "http://myhost/mycontext"

val postFields: Map[String, String] = ...
val request = url(SERVICES_URL) << postFields OK as.String
val post = Http(request)
于 2012-09-09T20:18:01.543 に答える