从 JSON 文件中读取 headers 并在 API 中设置为 Header 的元组使用 SCALA 中的播放调用

Reading headers from JSON file and setting as tuples for Header in API Call using Play in SCALA

正在从 JSON 文件中读取 headers 并在 API 中设置为 Header 的元组 使用 SCALA 中的播放调用

我有 Json 文件,其中包含 headers 和 body,如下所示: 文件名:test.json

{
    "request": {
    "headers" : {
            "Provider":"1122321",
            "Authorization":"44444444",
            "Agent":"Web",
            "Content-Type":"application/json"
          }
     "body":{
    }
    }
    }

现在我要做的是,从 Json 文件中读取 Body 和 Headers 并在稍后调用 API 时使用,我是为此使用 play WS 和 Play JSON (2.5.x),但我无法获取和设置 headers:

下面是我的代码,目前我有 hard-coded headers,但我需要从 JSON 获取和设置,我尝试的一种方法是添加 headers在元组列表和使用中,但我无法弄清楚如何从 JSON 文件中获取 headers 并将它们转换为元组列表

val file = new File("E:\test.json")
val fileIn = new FileInputStream(file)
val json: JsValue = Json.parse(fileIn)
val jsonbody = (json \ "data" \ "request" \"body").get
val jsonheader = (json \ "data" \ "request" \"headers").get
println(jsonheader)   
// {"Provider":"1122321","Authorization":"44444444","Agent":"Web","Content-Type":"application/json"}

var url: String = "http://test.com/api/test"

// wsClient.url(url2).withHeaders("Provider"->"1122321", "Authorization" ->` "44444444", "Agent" -> "Web", "Content-Type" -> "application/json", "ClientVersion" -> "3").post(jsonbody).map { response =>
  val resbody1: String = response.body
  val resstatus1: String = response.statusText

}

您需要将 JSON 转换为 JsObject 而不是 JsValue 正如 cchantep 所说,使用 case class :

更容易
case class Request(headers:JsObject, body:JsObject)
object Request {
   implicit lazy val format = Json.format[Request]
}

在您的代码中,您可以像这样映射您的 Json :

val file = new File("E:\test.json")
val fileIn = new FileInputStream(file)
val json: JsValue = Json.parse(fileIn)
val req = (json \ "request").as[Request]

现在可以使用 'fields' 属性访问元组列表:

val tuples:Seq[(String, JsValue)] = req.fields
val headers:Map[String, String] = tuples.map{ header =>
  header._1 -> header._2.as[String]
}.toMap

我能够实现我想要的,但我知道这不是一种有效的方法,如果有人能帮助我改进,我将不胜感激:

val file = new File("E:\test.json")
val fileIn = new FileInputStream(file)
val json: JsValue = Json.parse(fileIn)
val jsonbody = (json \ "data" \ "request" \"body").get
val jsonheader = (json \ "data" \ "request" \"headers").get
println(jsonheader)   
// {"Provider":"1122321","Authorization":"44444444","Agent":"Web","Content-Type":"application/json"}

 val jsonheaderlist = jsonheader.toString().substring(1, jsonfile.headersval.toString().length - 1)
      .split(",")
      .map(_.split(":"))
      .map { case Array(k, v) => (k.substring(1, k.length-1), v.substring(1, v.length-1))}
      .toMap.toList

var url: String = "http://test.com/api/test"

var req = wsClient.url(url)
jsonheaderlist.foreach{case(value)=>
    req = req.withHeaders(value)
    }
req = req.post(jsonbody).map { response =>
  val resbody1: String = response.body
  val resstatus1: String = response.statusText

}