实践出真知!Http接口联调实战

简介: 实践出真知!Http接口联调实战

场景

与供应商进行一次接口的对接,自己在postman中进行调试,发现可以正常调用,但是联调时对方却报请求方式错误,导致花费了较多时间。

  • 请求类型

    POST

  • 请求的url
    https://xxxxx/vehicleOperate/openapi/gateMachine/inRecord/518021_0054/parkcarin
  • 请求参数

     {
        "carinlist": "[{
            "id": "197",
            "entrance": "入口",
            "cardId": "BDF2413131313131",
            "cardNo": "津A11111",
            "carNo": "津A11111",
            "ownerName": "临时用户",
            "cardTypeId": "31",
            "cardTypeName": "临时卡A",
            "entranceTime": "2017-06-14 08:38:29",
            "entranceUserName": "系统管理员",
            "entranceWayId": "0",
            "entranceWayName": "正常入场",
            "small": "0",
            "entryPic": "",
            "MachNo":"1"
        }]",
        "signature":"SJDKLSJKLDJSKLSHJKSHDJKHJKHJK",
        "t":"1520416876"
    }
接口代码

    ```
    @PostMapping("/inRecord/{parkId}/parkcarin")
    public DoorRecordResult createInRecord(@RequestBody DoorGateMachineRecordInfoInVO doorGateMachineRecordInfoVO,
        @PathVariable("parkId") String parkId) {
        DoorRecordResult doorRecordResult = new DoorRecordResult();
        SSOUser ssoUser = getCurrentUser();
        log.info("parkId : {}, 入场消息消费:{}", parkId, JSONObject.toJSONString(doorGateMachineRecordInfoVO));
        List<DoorGateMachineRecordInVO> carinlist = doorGateMachineRecordInfoVO.getCarinlist();
        carinlist.stream().forEach(g -> {
            g.setCreatorId(ssoUser.getId());
            g.setCreatorName(ssoUser.getUsername() + "/" + ssoUser.getRealname());
            g.setCreateTime(new Date());
        });
        doorRecordResult = gateMachineService.handleInRecord(carinlist, parkId);
        log.info("入场消息消费处理结束 parkId : {}, 处理结果:{}", parkId, JSONObject.toJSONString(doorRecordResult));
        return doorRecordResult;
    }
    ```


通过postman调用接口可以调通返回数据,但是通过对方应用调用就是不行,其中试了几种方式都是不行,最终发现遗漏了一项,就是content-type,对方应用调用我们接口推送数据的content-type是application/x-www-form-urlencoded,而我这边接口支持的content-type实际上是application/json,导致接口无法调用,接口文档中content-type类型一定要标明,否则会严重影响接口的开发。

application/x-www-form-urlencoded和application/json有什么区别呢?首先要了解下一共有几种content-type
  1. application/x-www-form-urlencoded
    application/x-www-form-urlencoded是最常见的 POST 提交数据的方式了。浏览器的原生

    表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据,在springMVC里面接收此类型传递的数据要通过@RequestParam,如上面接口就可以修改成
    @PostMapping(value = "/inRecord/{parkId}/parkcarin",consumes = "application/x-www-form-urlencoded")
    public DoorRecordResult createInRecord(@RequestParam (value = "carinlist") String carinlistStr,
                                           @PathVariable("parkId") String parkId) {
    
        -----
        carinlistStr = parameterMap.get("carinlist")[0];
    
    }

    也可以不用springMVC的注解,直接从HttpServerlet中取值,如

    @PostMapping(value = "/inRecord/{parkId}/parkcarin",consumes = "application/x-www-form-urlencoded")
    public DoorRecordResult createInRecord(HttpServletRequest request,
                                           @PathVariable("parkId") String parkId) {
        List<DoorGateMachineRecordInVO> carinlist = null;
        Map<String, String[]> parameterMap = request.getParameterMap();
        try {
            String carinlistStr = parameterMap.get("carinlist")[0];
            log.info("入场消息消费处理开始 parkId : {}, 收到数据:{}", parkId,carinlistStr);
            carinlist = JacksonUtil.toList(carinlistStr, DoorGateMachineRecordInVO.class);

    之前对方系统报请求方式错误,就是因为代码中使用@RequestBody来接收参数,那什么时候要用@RequestBody来接收参数呢,这就要说第二种content-type

  2. application/json

    这个 Content-Type 作为响应头大家肯定不陌生。实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。
    这种类型是现在很常见的响应头,而接收她的参数就是@RequestBody,之前接口不通的原因也是我这边使用的响应头其实是application/json方式
    
  3. multipart/form-data

    这又是一个常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让

    表单的 enctype 等于 multipart/form-data
  4. text/xml

    它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。典型的 XML-RPC 请求是这样的:

    POST http://www.example.com HTTP/1.1 Content-Type: text/xml <?xml version="1.0"?> examples.getStateName41

除了content-type类型外,还要注意的就是如何在postman上测试application/x-www-form-urlencoded请求。由于入参是复杂的数组,所以要考虑postman如何传递数组。

起初以为是这样传递

image.png

一直调不通,后来才发现是这样的

image.png

由此可见postman默认是一行对应一个key-value,当时联调时由于对postman的这种调用不熟悉,所以使用通过java代码的调用形式,这两种也是异曲同工的。了解这些后我也对http的请求头进行了一些了解

Accept:客户端能接受的内容类型 text/plain, text/html

User-Agent :发起请求方的信息

结语

Http接口算是诸多接口中最简单的接口,但是如果不熟悉他的请求头,请求体,及相应框架的接收处理,也会产生一系列的问题,只有再实践中发掘其中问题,才能再下次处理接口时更好的处理功能的开发,更快的处理相关问题,提升开发的效率。

相关文章
|
19天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
2月前
|
Rust 前端开发 API
Tauri 开发实践 — Tauri HTTP 请求开发
本文介绍了如何在 Tauri 中发起 HTTP 请求。首先通过安装 Tauri 生态中的工具包并配置 `tauri.conf.json` 文件来允许特定域名的 HTTP 通信。接着封装了一个简单的 HTTP 客户端类,并在页面中使用该客户端实现 GET 和 POST 请求。最后提供了完整的源码地址以供参考。此功能使得桌面应用能够与远程服务器进行交互,增强了应用的实用性。
101 1
Tauri 开发实践 — Tauri HTTP 请求开发
|
2月前
|
存储 缓存 NoSQL
保持HTTP会话状态:缓存策略与实践
保持HTTP会话状态:缓存策略与实践
|
2月前
|
JSON Java fastjson
Java Http 接口对接太繁琐?试试 UniHttp 框架吧
UniHttp 是一个声明式的 HTTP 接口对接框架,旨在简化第三方 HTTP 接口的调用过程。通过注解配置,开发者可以像调用本地方法一样发起 HTTP 请求,无需关注请求的构建和响应处理细节。框架支持多种请求方式和参数类型,提供灵活的生命周期钩子以满足复杂的对接需求,适用于企业级项目的快速开发和维护。GitHub 地址:[UniAPI](https://github.com/burukeYou/UniAPI)。
|
2月前
|
存储 JSON API
HTTP 请求与响应处理:C#中的实践
【10月更文挑战第4天】在现代Web开发中,HTTP协议至关重要,无论构建Web应用还是API开发,都需要熟练掌握HTTP请求与响应处理。本文从C#角度出发,介绍HTTP基础知识,包括请求与响应结构,并通过`HttpClient`库演示如何发送GET请求及处理响应,同时分析常见错误并提供解决方案,助你更高效地完成HTTP相关任务。
95 2
|
6月前
|
安全 API 持续交付
阿里云云效产品使用问题之如何从流水线访问内网平台的HTTP接口
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
2月前
|
存储 缓存 监控
HTTP:强缓存优化实践
HTTP强缓存是提升网站性能的关键技术之一。通过精心设计缓存策略,不仅可以显著减少网络延迟,还能降低服务器负载,提升用户体验。实施上述最佳实践,结合持续的监控与调整,能够确保缓存机制高效且稳定地服务于网站性能优化目标。
49 3
|
3月前
|
JSON 移动开发 监控
快速上手|HTTP 接口功能自动化测试
HTTP接口功能测试对于确保Web应用和H5应用的数据正确性至关重要。这类测试主要针对后台HTTP接口,通过构造不同参数输入值并获取JSON格式的输出结果来进行验证。HTTP协议基于TCP连接,包括请求与响应模式。请求由请求行、消息报头和请求正文组成,响应则包含状态行、消息报头及响应正文。常用的请求方法有GET、POST等,而响应状态码如2xx代表成功。测试过程使用Python语言和pycurl模块调用接口,并通过断言机制比对实际与预期结果,确保功能正确性。
263 3
快速上手|HTTP 接口功能自动化测试
|
3月前
|
数据安全/隐私保护 Docker 容器
配置Harbor支持https功能实战篇
关于如何配置Harbor支持HTTPS功能的详细教程。
115 12
配置Harbor支持https功能实战篇