HttpClient 使用简单案例(scala 版本)

本文回顾了HttpClient在安卓开发中的历史背景,虽然谷歌已不再推荐在安卓中使用,但介绍了其基本使用。HttpClient是一个历史悠久的网络请求库,而现代安卓开发推荐使用HttpURLConnection、Volley、OkHttp和Retrofit等更现代的网络库。文章提供了环境配置和简单的Scala代码示例。

HttpClient 使用简单案例(scala 版本)

1. 背景

1.1 概述

  1. 在常见的客户端服务器模型中,最开始是BS模型,也就是browser和server模型,因为最开始都是电脑,浏览器访问占据主流地位。阿里巴巴,京东都是先从网站做起的。
  2. 之后的模型变成了cs模型,client客户端,server服务器。这是由于互联网兴起,各种移动客户端流量开始占据主流,如手机,平板,甚至手表,汽车都可以访问网络。
  3. 在这个过程中,作为企业级开发语言主流的java,也出现了很多网络请求库,其中比较有历史的就是httpclient这个库。比较悠久,但目前实际在安卓开发中,早就已经由谷歌提出了新的网络库选择,在安卓6.0之后,谷歌移除了httpclient的api接口了。
  4. 本文只是处于怀旧情况,回忆一下httpclient的简单使用
  5. 实际安卓开发中,目前可以有
  • HttpClient 这是底层的库之一,但目前谷歌官方不建议再在安卓开发中使用
  • HttpURLConnection ,这是sun公司编写的底层网络库,api较少,谷歌建议使用这种底层请求库
  • Volley,本身是基于底层请求库做了封装。在Android 2.3及以上的版本,使用的是HttpURLConnection,而在Android 2.2及以下版本,使用的是HttpClient。HurlStack和HttpClientStack分别对应HttpURLConnection 和HttpClient
  • OkHttp,okhttp是square公司开发的网络框架。目前使用较多的网络库之一。Android 4.4后,HttpURLConnection底层实现使用的就是OkHttp
  • Retrofit,Retrofit与okhttp一样出自于Square公司。Retrofit是一个封装的网络框架,底层网络框架使用的是OkHttp(Retrofit 2.0 开始不支持其他底层网络框架)。

1.2 官网介绍等

  • http://hc.apache.org/httpclient-3.x/
    在这里插入图片描述
  • github
    https://github.com/apache/httpcomponents-client
    在这里插入图片描述
  • maven
    https://mvnrepository.com/search?q=httpclient
    在这里插入图片描述
    在这里插入图片描述

2. 代码

  1. 环境准备
  • maven 3.6.3
  • idea 2020
  • jdk 1.8
  • scala 2.12.12
  • pom文件
<!-- 定义了一些常量 -->
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <scala.version>2.12.10</scala.version>
        <spark.version>3.0.1</spark.version>
        <hbase.version>2.2.5</hbase.version>
        <hadoop.version>3.2.1</hadoop.version>
        <encoding>UTF-8</encoding>
    </properties>

    <dependencies>
        <!-- 导入scala的依赖 -->
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>${scala.version}</version>
            <!-- 编译时会引入依赖,打包是不引入依赖 -->
            <!--            <scope>provided</scope>-->
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.12</version>
        </dependency>


        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.12</artifactId>
            <version>${spark.version}</version>
            <!-- 编译时会引入依赖,打包是不引入依赖 -->
            <!--            <scope>provided</scope>-->
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.73</version>
        </dependency>

    </dependencies>

    <build>
        <pluginManagement>
            <plugins>
                <!-- 编译scala的插件 -->
                <plugin>
                    <groupId>net.alchim31.maven</groupId>
                    <artifactId>scala-maven-plugin</artifactId>
                    <version>3.2.2</version>
                </plugin>
                <!-- 编译java的插件 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.5.1</version>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
            <plugin>
                <groupId>net.alchim31.maven</groupId>
                <artifactId>scala-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>scala-compile-first</id>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>add-source</goal>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>scala-test-compile</id>
                        <phase>process-test-resources</phase>
                        <goals>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>compile</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <!-- 打jar插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.4.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
  1. 演示代码
package com.doit.day07


import com.alibaba.fastjson.{JSON, JSONObject}
import org.apache.http.HttpEntity
import org.apache.http.client.methods.{CloseableHttpResponse, HttpGet}
import org.apache.http.impl.client.{CloseableHttpClient, HttpClients}
import org.apache.http.util.EntityUtils

object HttpClientTest {
  def main(args: Array[String]): Unit = {

    // 创建客户端对象
    val httpClient: CloseableHttpClient = HttpClients.createDefault()

    val longitude = 119.3
    val latitude = 40

    // 创建一个httpGet,这里面拼接域名,path,以及参数,因为是get类型,参数都在url里面
    // 这里使用的高德地图开放出来的API接口进行演示
    val httpGet = new HttpGet(s"https://restapi.amap.com/v3/geocode/regeo?&location=$longitude,$latitude&key=4924f7ef5c86a278f5500851541cdcff")

    // 执行请求,获取返回信息对象
    val response: CloseableHttpResponse = httpClient.execute(httpGet)

    // 获取返回信息对象中实体对象
    val entity: HttpEntity = response.getEntity

    // http状态码,2xx,3xx,4xx,5xx,
    // 2开头一般表明请求成功如200,3开头一般是重定向,4开头一般是请求参数错误如404标识找不到
    // 5开头一般是服务器错误
    if(response.getStatusLine.getStatusCode == 200) {
      // 将返回结果中数据转换为字符串
      val resultStr: String = EntityUtils.toString(entity)

      // 将字符串转换为JSON对象
      val jsonObj: JSONObject = JSON.parseObject(resultStr)

      // 根据API说明文档字段,进行数据解析
      val regeocode: JSONObject = jsonObj.getJSONObject("regeocode")

      // 判空处理,防止异常
      if(regeocode != null && regeocode.isEmpty == false) {
        val address: JSONObject = regeocode.getJSONObject("addressComponent")

        println(address)
      }
    }

    // 关闭请求
    httpClient.close()
  }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值