Spark 如何 post 数据

2019-02-16  本文已影响5人  学习之术
Photo by Johannes Plenio from Pexels

有时候,为了方便运营,一个栏位需要配置多种源数据。

不同数据源的更新方式或频率会有所不同,而且是由不同的人来维护的。

为了前端接口的简洁性,需要将多种数据汇总到一张表中。

这种时候,可以选择将数据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>

参考资料

  1. https://github.com/json4s/json4s/issues/43

  2. https://www.programcreek.com/scala/org.apache.http.client.methods.HttpPost

  3. https://stackoverflow.com/questions/29908297/how-can-i-convert-a-json-string-to-a-scala-map

  4. https://zh.wikipedia.org/wiki/HTTP%E7%8A%B6%E6%80%81%E7%A0%81

上一篇下一篇

猜你喜欢

热点阅读