gpt4 book ai didi

scala - 我可以为 route 的所有入口点创建默认的 OPTIONS 方法指令吗?

转载 作者:行者123 更新时间:2023-12-03 18:03:40 26 4
gpt4 key购买 nike

我不想明确写:

options { ... }

对于我的 Spray route 的每个入口点/路径。我想编写一些通用代码来添加 OPTIONS支持所有路径。它应该查看路由并从中提取支持的方法。

我无法粘贴任何代码,因为我不知道如何在 Spray 中处理它。

我这样做的原因是我想提供一个符合 HATEOAS 原则的可自我发现的 API。

最佳答案

下面的指令将能够捕获被拒绝的请求,检查它是否是一个选项请求,然后返回:

  • CORS header ,支持 ​​CORS( 此指令删除所有 cors 保护,当心!!!!! )
  • Allow header ,为对等方提供可用方法列表

  • 尝试理解以下代码段并在必要时对其进行调整。您应该希望提供尽可能多的信息,但如果您只想返回 Allowed 方法,我建议您去掉其余的 :)。

    import spray.http.{AllOrigins, HttpMethods, HttpMethod, HttpResponse}
    import spray.http.HttpHeaders._
    import spray.http.HttpMethods._
    import spray.routing._

    /**
    * A mixin to provide support for providing CORS headers as appropriate
    */
    trait CorsSupport {
    this: HttpService =>

    private val allowOriginHeader = `Access-Control-Allow-Origin`(AllOrigins)
    private val optionsCorsHeaders = List(
    `Access-Control-Allow-Headers`(
    "Origin, X-Requested-With, Content-Type, Accept, Accept-Encoding, Accept-Language, Host, " +
    "Referer, User-Agent"
    ),
    `Access-Control-Max-Age`(60 * 60 * 24 * 20) // cache pre-flight response for 20 days
    )

    def cors[T]: Directive0 = mapRequestContext {
    context => context.withRouteResponseHandling {
    // If an OPTIONS request was rejected as 405, complete the request by responding with the
    // defined CORS details and the allowed options grabbed from the rejection
    case Rejected(reasons) if (
    context.request.method == HttpMethods.OPTIONS &&
    reasons.exists(_.isInstanceOf[MethodRejection])
    ) => {
    val allowedMethods = reasons.collect { case r: MethodRejection => r.supported }
    context.complete(HttpResponse().withHeaders(
    `Access-Control-Allow-Methods`(OPTIONS, allowedMethods :_*) ::
    allowOriginHeader ::
    optionsCorsHeaders
    ))
    }
    } withHttpResponseHeadersMapped { headers => allowOriginHeader :: headers }
    }
    }

    像这样使用它:

    val routes: Route =
    cors {
    path("hello") {
    get {
    complete {
    "GET"
    }
    } ~
    put {
    complete {
    "PUT"
    }
    }
    }
    }

    资源: https://github.com/giftig/mediaman/blob/22b95a807f6e7bb64d695583f4b856588c223fc1/src/main/scala/com/programmingcentre/utils/utils/CorsSupport.scala

    关于scala - 我可以为 route 的所有入口点创建默认的 OPTIONS 方法指令吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25420619/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com