有时候,为了方便运营,一个栏位需要配置多种源数据。
不同数据源的更新方式或频率会有所不同,而且是由不同的人来维护的。
为了前端接口的简洁性,需要将多种数据汇总到一张表中。
这种时候,可以选择将数据post到数据接收方,这样就能很方便地汇总多种源数据。
近来我也碰到这种情况,需要使用Spark将数据post给对方。下面介绍下我的方案。
第一步:将数据转化为json字符串格式
先将数据按要求转成Map类型,key与value都需要和数据接收方约定好,不然对方解析数据时就得不到想要的结果。
假设最终组装好的Map类型数据为x,接着需要将其转化为json字符串类型。
本文使用json4s工具包,并使用jackson支持,原生的支持在使用时报错,显示java.lang.NoClassDefFoundError: org/json4s/native/Json$
。
具体的使用方法如下:
import org.json4s.jackson.Json
import org.json4s.DefaultFormats
val jsonData = Json(DefaultFormats).write(x)
第二步:使用httpClient Post数据
import org.json4s._
import org.json4s.jackson.JsonMethods._
import java.net.URI
import java.nio.charset.StandardCharsets
import org.apache.commons.io.IOUtils
import org.apache.http.HttpHeaders
import org.apache.http.Consts
import org.apache.http.client.methods.HttpPost
import org.apache.http.entity.StringEntity
import org.apache.http.impl.client.HttpClients
val client = HttpClients.createDefault()
val post = new HttpPost(new URI(你的api))
post.addHeader(HttpHeaders.CONTENT_TYPE, "application/json")
val entity = new StringEntity(jsonData, Consts.UTF_8.toString)
entity.setContentEncoding("UTF-8")
entity.setContentType("application/json")
post.setEntity(entity)
val resp = client.execute(post) //post数据
// 确保数据已被接收,状态码为200(可能会有不同参考资料)以及result为1
try {
val entity = resp.getEntity
val result: String = IOUtils.toString(entity.getContent, StandardCharsets.UTF_8)
println(result)
implicit val formats: DefaultFormats.type = org.json4s.DefaultFormats
val resultJson: Map[String, Any] = parse(result).extract[Map[String, Any]]
// 状态异常时发送警报
if (resultJson.getOrElse("result","-1").toString != "1" || resp.getStatusLine.getStatusCode != 200) {
Monitor.sendAlarm(WECHAT_ID, APP_NAME, "数据未正常post")
}
} finally {
resp.close()
}
题外话,搜索关键词非常重要。
以前没接触过post,所以刚开始试着搜索 spark post、spark http post json data example、spark rest api post json、spark post jsdon data等关键词,但都没找到合适的材料。
但通过上述找到的资料,大概知道了可能使用httpClient,所以尝试着使用spark HttpClient post搜索,结果在第一页第二条就发现了关键资料(参考文未)。
所以在搜索时,若是前几页没查到想要的资料,那就得考虑是不是自己的搜索词有问题。
而且通常情况下,对于编程问题,使用英文搜索词比使用中文更容易查到解决方案。毕竟所有的编程语言都是以拉丁字母,而不是用中文进行编写的。
需要添加的依赖
<dependency>
<groupId>org.json4s</groupId>
<artifactId>json4s-jackson_2.11</artifactId>
<version>3.6.4</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpasyncclient</artifactId>
<version>4.1.3</version>
<exclusions>
<exclusion>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
</exclusion>
</exclusions>
</dependency>
参考资料
网友评论