专栏首页关忆北.HTTP对接方式

HTTP对接方式

HTTP对接方式

对接HTTP接口主要有两种方式

  • 使用httpUtil方式
  • 使用RestTempalate方式

一、HTTP方式

当前方式主要是通过构造HTTP请求进行对第三方接口进行调用,返回JSON数据,为了方便起见可以使用HTTPUtil对常用的请求方式进行封装,在进行调用时直接传参构造请求即可。

HTTPUtils方式之Get请求

@Test
    void test() throws IOException {
        String url;
        String requestUrl = UrlConstant.WeatherUrl;
        String appid = "57847229";
        String appsecret = "jN4fUx1a";
        String lng = "114.302953";
        String lat = "30.585411";
        url = String.format("%s?appid=%s&appsecret=%s&lng=%s&lat=%s&version=v11",
                requestUrl,
                appid,
                appsecret,
                lng,
                lat);
        //这里构造了url,也可直接使用String类型直接定义url
        //String url = "https://v0.yiketianqi.com/api?appid=57847229&appsecret=jN4fUx1a&lng=114.302953&lat=30.585411&version=v11";
        log.warn(url);
        //使用httpUtil方式
        String s = HttpUtil.get(url);
        log.info(s);
    }

输出格式化后的JSON数据:得到的JSON数据可以使用FastJson或者GSON进行格式化解析,该技术非本篇主要内容,若使用FastJson有问题请自行Google/百度
    {
    "errcode":0,
    "time":"2020-10-05 15:10:00",
    "update_time":"2020-10-05 15:05:00",
    "msg":"30分钟后开始下小雨,不过100分钟后雨就停了",
    "data":[
        {
            "time":"2020-10-05 15:20:00",
            "level":"",
            "value":"0"
        },
        {
            "time":"2020-10-05 15:25:00",
            "level":"",
            "value":"0"
        },
        {
            "time":"2020-10-05 15:30:00",
            "level":"",
            "value":"0"
        },
        {
            "time":"2020-10-05 15:35:00",
            "level":"",
            "value":"0"
        },
        {
            "time":"2020-10-05 15:40:00",
            "level":"",
            "value":"0"
        },
        {
            "time":"2020-10-05 15:45:00",
            "level":"",
            "value":"0"
        },
        {
            "time":"2020-10-05 15:50:00",
            "level":"小雨",
            "value":"0.03"
        },
        {
            "time":"2020-10-05 15:55:00",
            "level":"小雨",
            "value":"0.06"
        },
        {
            "time":"2020-10-05 16:00:00",
            "level":"小雨",
            "value":"0.09"
        },
        {
            "time":"2020-10-05 16:05:00",
            "level":"小雨",
            "value":"0.11"
        },
        {
            "time":"2020-10-05 16:10:00",
            "level":"小雨",
            "value":"0.13"
        },
        {
            "time":"2020-10-05 16:15:00",
            "level":"小雨",
            "value":"0.14"
        },
        {
            "time":"2020-10-05 16:20:00",
            "level":"小雨",
            "value":"0.13"
        },
        {
            "time":"2020-10-05 16:25:00",
            "level":"小雨",
            "value":"0.13"
        },
        {
            "time":"2020-10-05 16:30:00",
            "level":"小雨",
            "value":"0.1"
        },
        {
            "time":"2020-10-05 16:35:00",
            "level":"小雨",
            "value":"0.07"
        },
        {
            "time":"2020-10-05 16:40:00",
            "level":"小雨",
            "value":"0.05"
        },
        {
            "time":"2020-10-05 16:45:00",
            "level":"小雨",
            "value":"0.05"
        },
        {
            "time":"2020-10-05 16:50:00",
            "level":"小雨",
            "value":"0.04"
        },
        {
            "time":"2020-10-05 16:55:00",
            "level":"小雨",
            "value":"0.06"
        },
        {
            "time":"2020-10-05 17:00:00",
            "level":"",
            "value":"0"
        }
    ]
}

当前使用的案例是调用一个天气的api,获取天气信息 文档地址:https://www.tianqiapi.com/index/doc 字符串拼接详见: https://www.cnblogs.com/Dhouse/p/7776780.html

HTTPUtils方式之Post请求

我们首先启动一个Post接口的demo,并启动该demo

本地配置文件没有任何配置,所以请求的地址是:

http://localhost:8080/post/post

@org.springframework.web.bind.annotation.RestController
@RequestMapping("/post")
public class RestController {
    @PostMapping("/post")
    public String post(HttpServletRequest request,
                       @RequestParam(value = "email", required = false) String email,
                       @RequestParam(value = "nick", required = false) String nick) {
        Map<String, Object> map = new HashMap<>();
        map.put("code", "200");
        map.put("result", "add " + email + " # " + nick + " success!");
        return JSON.toJSONString(map);
    }
}

使用HTTPUtils以Post方式请求

    @Test
    void testByPostUtils() throws Exception{
        String url = "http://localhost:8080/post/post";
        String email = "http://49.232.21.180:8090/";
        String nick = "关忆北_Blog";

        Map<String, String> request = new HashMap<>();
        request.put("email", email);
        request.put("nick", nick);

       String postForm = HttpUtil.postForm(url, request);
        
        //输出打印:
        {"result":"add http://49.232.21.180:8090/ # null success!","code":"200"}
    }

二、RestTempalate方式

RestTempalate 简介:

SpringRestTemplate是Spring 提供的用于访问 Rest 服务的客端**(用于发起HTTP请求)**, RestTemplate交由Spring管理,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率,所以很多客户端比如Android或者第三方服务商都是使用RestTemplate 请求 restful服务。

借用网络中的整理的API表格

详情可以查看Spring官网 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html

API

说明

getForEntity()

发送一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象

getForObject()

发送一个HTTP GET请求,返回的请求体将映射为一个对象

postForEntity()

POST 数据到一个URL,返回包含一个对象的ResponseEntity,这个对象是从响应体中映射得到的

postForObject()

POST 数据到一个URL,返回根据响应体匹配形成的对象

headForHeaders()

发送HTTP HEAD请求,返回包含特定资源URL的HTTP头

optionsForAllow()

发送HTTP OPTIONS请求,返回对特定URL的Allow头信息

postForLocation()

POST 数据到一个URL,返回新创建资源的URL

put()

PUT 资源到特定的URL

delete()

在特定的URL上对资源执行HTTP DELETE操作

exchange()

在URL上执行特定的HTTP方法,返回包含对象的ResponseEntity,这个对象是从响应体中映射得到的

execute()

在URL上执行特定的HTTP方法,返回一个从响应体映射得到的对象

getForObject函数实际上是对getForEntity函数的进一步封装,如果你只关注返回的消息体的内容,对其他信息都不关注,此时可以使用getForObject。

RestTempalate 配置:

使用RestTempalate之前需要对其进行配置,否则会无法注入到Spring中,即使用时,restTempalate是null;将RestTemplate使用@Configuration注解配置:

@Configuration
public class RestTemplateConfig {


    //最好是用不注释的方法,在注入的同时设置连接时间,这种注释的也可以,但是没有设置超时时间
    /*@Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        return builder.build();
    }*/

    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
        return new RestTemplate(factory);
    }

    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setReadTimeout(5000);//单位为ms
        factory.setConnectTimeout(5000);//单位为ms
        return factory;
    }
}

更为详尽的配置请参考以下方式: https://www.jianshu.com/p/2cc999c0b99d

RestTempalate引入使用:

    @Autowired
    public RestTemplate restTemplate;

RestTempalate方式之Get请求

    @Test
    void test() throws IOException {
        String url;
        String requestUrl = UrlConstant.WeatherUrl;
        String appid = "57847229";
        String appsecret = "jN4fUx1a";
        String lng = "114.302953";
        String lat = "30.585411";
        url = String.format("%s?appid=%s&appsecret=%s&lng=%s&lat=%s&version=v11",
                requestUrl,
                appid,
                appsecret,
                lng,
                lat);
        log.warn(url);

        //使用RestTempalate方式
        Weather weather = restTemplate.getForObject(url, Weather.class);
        log.info(weather.toString());
        log.info(s);
    }

输出:
    Weather(errcode=0, time=2020-10-05 16:11:00, update_time=2020-10-05 16:05:00, msg=10分钟后雨渐停,不过30分钟后又开始下小雨, data=[WeatherData(time=2020-10-05 16:20:00, level=小雨, value=0.12), WeatherData(time=2020-10-05 16:25:00, level=小雨, value=0.06), WeatherData(time=2020-10-05 16:30:00, level=, value=0), WeatherData(time=2020-10-05 16:35:00, level=, value=0), WeatherData(time=2020-10-05 16:40:00, level=, value=0), WeatherData(time=2020-10-05 16:45:00, level=, value=0), WeatherData(time=2020-10-05 16:50:00, level=小雨, value=0.04), WeatherData(time=2020-10-05 16:55:00, level=小雨, value=0.06), WeatherData(time=2020-10-05 17:00:00, level=小雨, value=0.06), WeatherData(time=2020-10-05 17:05:00, level=小雨, value=0.01), WeatherData(time=2020-10-05 17:10:00, level=, value=0), WeatherData(time=2020-10-05 17:15:00, level=, value=0), WeatherData(time=2020-10-05 17:20:00, level=, value=0), WeatherData(time=2020-10-05 17:25:00, level=, value=0), WeatherData(time=2020-10-05 17:30:00, level=, value=0), WeatherData(time=2020-10-05 17:35:00, level=, value=0), WeatherData(time=2020-10-05 17:40:00, level=, value=0), WeatherData(time=2020-10-05 17:45:00, level=小雨, value=0.02), WeatherData(time=2020-10-05 17:50:00, level=小雨, value=0.04), WeatherData(time=2020-10-05 17:55:00, level=小雨, value=0.05), WeatherData(time=2020-10-05 18:00:00, level=小雨, value=0.08)])

可以发现,使用RestTempalate返回的数据是已经解析到对象中的,在入参中,Weather.class可以理解为是一个Json转换器,把JSON数据转换成(序列化)对象。

注:返回的JSON数据必须与转换器实体类的字段一一对应,否则会无法转义。

@lombok.Data
public class Weather implements Serializable {
    private String errcode;
    private String time;
    private String update_time;
    private String msg;
    private List<WeatherData> data;
}

与之对比,使用RestTempalate发起HTTP请求,无需再使用FastJson或GSON进行解析返回的数据,当获取对象中的变量时可以直接使用getXXX的方式进行获取。

RestTempalate方式之Post请求

@Test
public void testPostLocation() {
        String url = "http://localhost:8080/post/post";
        String email = "http://49.232.21.180:8090/";
        String nick = "关忆北_Blog";

        MultiValueMap<String, String> request = new LinkedMultiValueMap<>();
        request.add("email", email);
        request.add("nick", nick);

    // 使用方法三
    URI uri = restTemplate.postForLocation(url, request);
    System.out.println(uri);
}

输出:
    {"result":"add http://49.232.21.180:8090/ # 关忆北_Blog success!","code":"200"}
  • uri参数,使用姿势和get请求中一样,填充uri中模板坑位
  • 表单参数,由MultiValueMap封装,同样是kv结构
我已将本demo放置在我的Github中!,欢迎访问

https://github.com/FirstMrRight/abutment

个人网站已同步更新,阅读效果更佳

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://blog.csdn.net/weixin_42313773复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 更换HTTP代理的方式

    爬虫代理IP被应用到了很多的场景中,无论是对于家庭网络还是工作中的网络来说,为我们平时的工作提供了很多服务,有其是网络爬虫,爬虫代理IP更是不可缺少的一部分。面...

    用户6172015
  • 通过 http 方式获取 RabbitM

      在使用 pika 连接 RabbitMQ 的过程中,发现只能获取 ready 状态的消息数量,只好用 http 请求来实现目的。

    py3study
  • 关于HTTP提交方式之PUT

    转自:http://blog.csdn.net/xiaopeng__/article/details/6993297

    forrestlin
  • 网络知识---http请求几种方式

    1.HEAD 向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。...

    wust小吴
  • python的HTTP请求方式(sock

    DNS解析(浏) ->TCP连接(三次握手)->http Requests(浏)->Response(服) -> Parse(浏)-> Render(浏)->T...

    py3study
  • 正确使用HTTP代理的方式

    互联网的大数据时代,网络爬虫的工作离不开大数据。在我们使用网络过程中,肯定遇到过访问网站IP受限这种问题。其实不是你的IP出现了问题,而是对方因为目标网站的服务...

    用户6172015
  • Android之Http通信——3.Android HTTP请求方式:HttpURLConnection

    另外除了上面这些外,有时我们还可能须要对响应码进行推断,比方200: if(conn.getResponseCode( ) != 200)然后一些处理 ...

    全栈程序员站长
  • HTTP方式文件分片断点下载

    在进行大文件或网络带宽不是很好的情况下,分片断点下载就会显得很有必要,目前各大下载工具,如:迅雷等,都是很好的支持分片断点下载功能的。本文就通过http方式进...

    xcbeyond
  • HTTP跨域详解和解决方式

    那么究竟什么是跨域,跨域又是怎么产生的,以及跨域请求的问题需要怎么解决。我们一起来了解一下这些知识。

    仙士可
  • python: 使用http方式调用pb协议

    超级大猪
  • Http环境下的保持连接方式

    Http环境本身是一种无连接状态的架构,在这种架构下服务器只能是被动的接受客户端的请求,返回结果,而无法主动的给客户端发送数据。而在很多需要实时数据交互(比如W...

    Java架构师必看
  • HTTP协议和它的请求方式

    HTTP (HTTP-Hypertext transfer protocol),即超文本传送协议,HTTP协议位于应用层,由请求和响应构成。

    sean.liu
  • 用HTTP方式调用Gearman任务处理

    This protocol plugin allows you to map HTTP requests to Gearman jobs. It only pr...

    星哥玩云
  • sparkStreaming与kafka 两种对接方式与exectly once 实现

    当使用kakfa作为sparkStreaming 的数据源时有两种对接方式: reciver 与 direct

    Flink实战剖析
  • 分子对接教程 | (6) AutoDock对接操作与对接结果解读

    接下来你可以按照下图设置显示形式,颜色按照前面的倒三角形里面选择显示二级结构,通过链显示颜色。

    DoubleHelix
  • HTTP请求GET方式不能发送BODY数据?

    今天加班,身边一同事调用其他部门同事提供的http接口,一直返回405,该接口的说明是GET请求+JSON格式报文体。

    码农小麦
  • Java实现多种方式的http数据抓取

    前言:   时下互联网第一波的浪潮已消逝,随着而来的基于万千数据的物联网时代,因而数据成为企业的重要战略资源之一。基于数据抓取技术,本文介绍了java相关抓...

    云海谷天
  • Zipkin链路追踪HTTP与RabbitMQ方式

    上一篇只是单纯的从原理上以及控制台上去实践系统之间的打通,但是如果能从页面上去看每一个请求日志的链路情况就更好了。其实zipkin是提供了一个UI后台管理给到我...

    chengcheng222e

扫码关注腾讯云开发者

领取腾讯云代金券