1

だから私は以前にこれについて尋ね、多くのコードを変更しました。

スプレー ルーティングが一致しません

今、ブロックしないように、detach() ブロック内の HTTPresponses を返す関数を実行しています。その後、これらは完了してクライアントに戻りますが、まだルーティングを機能させることができないようです。

私のテストでは、単一のスラッシュへのリクエストは正常に機能しますが、以下に示すこのユーザー パスの作成など、他のリクエストはすべて失敗します。理由がわからず、スプレー ルーティングは非常に多くの構成要素を使用しており、システムがどのようにうまく機能しているかを理解するのに苦労しています。

何が起こっているのかを示すかもしれないと考えて、特定のパスの周りに logRequest ブロックを挿入しようとしましたが、どれもヒットしていないようです。どんな助けでも大歓迎です。

val route: Route = {
    host("fakebook.com", "www.fakebook.com") {
      pathSingleSlash {
        complete("pong")
      } ~
        pathPrefix("users") { req =>
            path("newuser") {
                put {
                  detach() {
                    complete(genericPut(CreateUser(req.request)))
                  }
                }
            } ~
            ... rest of routing

これが私のスケーラテストの外観です。単純な Put はパスしますが、newuser を使用した put はパスしません。

val createUserSuccessRequest = Put(Uri("http://www.fakebook.com/users/newuser") withQuery(F_User.lastNameString -> "Doe", F_User.firstNameString -> "John", F_User.bioString -> "i like foobar",
    F_User.ageString -> "42", F_User.dobString -> dateFormatter.format(new Date(1970 - 1900, 5, 7))))

 "The FakeBook route" when {

    "When sending a single slash request" should {
      "respond with a simple pong" in {
        Get() ~> logRequestResponse("plain get final request and response")(sealRoute(route)) ~> check {
          assert(responseAs[String] == "pong")
        }
      }
    }

    "Running route to create a user with PUT" should {
      "forward a message to the backbone to create a new user" in {
        createUserSuccessRequest ~> logRequest("create user final request and response"){sealRoute(route)} ~> check {
          expectMsg(CreateUser(createUserSuccessRequest))
        }
      }
    }
  }
4

1 に答える 1

1

この問題を解決しようとしている他の人のために:

これらのディレクティブの多くは実際には何も抽出しないため、req => や req2 => のようなラムダ入力を使用しても機能しません。

スプレー ルーティングは、関数で行ったように RequestContext に触れる必要がないように設計されていることがわかりました (これが、アクセスしようとする理由です)。有用なデータのみを抽出します。必要に応じて関数のシグネチャを変更するのではなく、(今のところ) 機能する修正プログラムを実行します。

絶対にリクエストコンテキストが必要な場合は、何らかの方法でそれを壊さない限り、独自の抽出ディレクティブをそのように val extractRequestContext = extract(x => x)作成してコードをラップすることで抽出できます

これは私がしました

path("somepath") {
     detach() {
          extractRequestContext { request => complete(someFunc(request)) }
     }
}

将来的には、DSL をより正しく使用し、ディレクティブを使用して要求コンテキストから必要なものを抽出し、それらを関数に渡すことを学ぶ必要があります

于 2015-11-28T20:17:12.760 に答える