2

Webサーバーが404を返す限り、うまく機能するHTTPリクエストを作成するためにデータバインダーディスパッチを使用しています.

要求が失敗した場合、Web サーバーは 403 ステータス コードを返し、詳細なエラー メッセージを応答本文で XML として提供します。

(403 に関係なく) xml 本文を読み取る方法、たとえば、ディスパッチで 403 エラーをすべて無視するにはどうすればよいですか?

私のコードは次のようになります。

class HttpApiService(val apiAccount:ApiAccount) extends ApiService {
  val http = new Http

  override def baseUrl() = "http://ws.audioscrobbler.com/2.0"

  def service(call:Call) : Response = {
    val http = new Http
    var req = url(baseUrl())
    var params = call.getParameterMap(apiAccount)

    var response: NodeSeq = Text("")

    var request: Request = constructRequest(call, req, params)
    // Here a StatusCode exception is thrown. 
    // Cannot use StatusCode case matching because of GZIP compression
    http(request <> {response = _})
    //returns the parsed xml response as NodeSeq
    Response(response)
  }

  private def constructRequest(call: Call, req: Request, params: Map[String, String]): Request = {
    val request: Request = call match {
      case authCall: AuthenticatedCall =>
        if (authCall.isWriteRequest) req <<< params else req <<? params
      case _ => req <<? params
    }
    //Enable gzip compression
    request.gzip
  }
}
4

1 に答える 1

2

私はこのようなものがうまくいくと信じています:

val response: Either[String, xml.Elem] = 
  try { 
    Right(http(request <> { r => r })) 
  } catch { 
    case dispatch.StatusCode(403, contents) => 
      Left(contents)
  }

エラーは左にあります。成功は右にあります。エラーは、必要な XML 応答を含む文字列です。

さらに必要な場合は、完全に制御できる HttpExecutor.x を参照してください。とはいえ、ディスパッチを使用するのは久しぶりです。

また、より多くの val とより少ない var を使用することをお勧めします。

于 2012-05-29T01:03:33.607 に答える