从 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
}
正在从 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
}