使用 formFields 导致 UnsupportedRequestContentTypeRejection 的 Akka Http 路由测试

Posted

技术标签:

【中文标题】使用 formFields 导致 UnsupportedRequestContentTypeRejection 的 Akka Http 路由测试【英文标题】:Akka Http route test with formFields causing UnsupportedRequestContentTypeRejection 【发布时间】:2022-01-22 06:22:10 【问题描述】:

我有一个带有参数和表单域的 GET 请求。

当我使用 Insomnia/Postman 之类的客户端发送请求时,它可以工作。

但下面的路由测试失败并出现错误:

UnsupportedRequestContentTypeRejection(Set(application/x-www-form-urlencoded, multipart/form-data))

(由解组器创建的拒绝。表示请求被拒绝,因为请求的内容类型不受支持。)

我已经尝试了我能想到的一切来修复它,但它仍然返回相同的错误。

这是导致问题的formField,由于某种原因,当被测试调用时它不喜欢标题。

跟 withEntity 有关系吗?

代码:

path("myurl" ) 
  get 
    extractRequest  request =>
      parameters('var1.as[String], 'var2.as[String], 'var3.as[String], 'var4.as[String])  (var1, var2, var3, var4) =>
        formField('sessionid.as[String])  (sessionid) =>
          complete                 
              request.headers.foreach(a => println("h=" + a))
              
            
          
        
      
    

测试:

// TESTED WITH THIS - Fails with UnsupportedRequestContentTypeRejection(Set(application/x-www-form-urlencoded, multipart/form-data))
class GETTest extends FreeSpec with Matchers with ScalatestRouteTest 
val get = HttpRequest(HttpMethods.GET, uri = "/myurl?var1=456&var2=123&var3=789&var4=987")
.withEntity("sessionid:1234567890")
.withHeaders(
  scala.collection.immutable.Seq(
    RawHeader("Content-Type", "application/x-www-form-urlencoded"),  // same problem if I comment out these 2 Content-Type lines
    RawHeader("Content-Type", "multipart/form-data"),
    RawHeader("Accept", "Application/JSON")
  )
)

get ~> route ~> check 
status should equal(StatusCodes.OK)


在formField行之前抛出异常。

完全例外:

ScalaTestFailureLocation: akka.http.scaladsl.testkit.RouteTest$$anonfun$check$1 at (RouteTest.scala:57)
org.scalatest.exceptions.TestFailedException: Request was rejected with rejection UnsupportedRequestContentTypeRejection(Set(application/x-www-form-urlencoded, multipart/form-data))
    at akka.http.scaladsl.testkit.TestFrameworkInterface$Scalatest$class.failTest(TestFrameworkInterface.scala:24)

【问题讨论】:

【参考方案1】:

你可以使用:

val get = HttpRequest(HttpMethods.GET, uri = "/myurl?var1=456&var2=123&var3=789&var4=987", entity = FormData("sessionid" -> "1234567.890").toEntity)

val get = Get("/myurl?var1=456&var2=123&var3=789&var4=987", FormData("sessionid" -> "1234567.890"))

【讨论】:

谢谢,两者都有效,我选择了第二个,因为它有点短

以上是关于使用 formFields 导致 UnsupportedRequestContentTypeRejection 的 Akka Http 路由测试的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 FormFields 的 WTForms FieldList?

节五:wtforms FormField超级炫酷使用

如何在 ModelAdmin.formfield_for_manytomany() 中使用 Django QuerySet.union()?

如何在带有 FormField 的 Flask / WTForms 中使用 populate_obj?

根据 Django 文档,尝试使用 formfield_overrides 更改 TextField 字段大小时出错

itextpdf FormField 生成pdf修改字体大小