接口联调踩坑记

一个集团内部系统间为了避免数据孤岛的情况出现,总是少不了数据的同步,因此系统间的接口就必不可少。但是开发出的接口在对接的时候总是会出现各种各样奇葩的问题。这里记录几种日常接口对接所踩的坑(注意:这里的接口联调是后端传后端,并非所谓的前后端对接)

1.所调接口网络不通

有些公司使用的是集团内部网络,经常会出现服务器之间网络不通的情况,Linux服务器排查思路

  1. 测试对接的目标接口网络
  2. #telnet命令
  3. telnet 域名/IP 端口
  4. 如: telnet xxx.xxx.com 443
  5. #ping 命令
  6. ping IP/域名
  7. 如: ping www.baidu.com

解决办法:处理网络连接权限问题

#

2.确认所调用接口可行性和连通性,是否存在bug

可以使用接口测试工具PostMan或SoapUI进行测试

#

3.确认目标接口接收数据的格式

确认目标接口是http接口还是webService接口,接收数据的格式是application/json,还是application/xml,或是multipart/form-data

接收形式例子:

3.1 @RequestParam形式

  1. @ResponseBody
  2. @RequestMapping(value = "doListOrder", method = {RequestMethod.GET, RequestMethod.POST}, produces = MediaType.APPLICATION_JSON_VALUE)
  3. public Object doListOrder(HttpServletRequest request,
  4. @RequestParam(value = "status", required = false) String status,
  5. @RequestParam(value = "commentStatus", required = false) String commentStatus,
  6. @RequestParam(value = "dealFrom", required = false) String dealTimeFrom,
  7. @RequestParam(value = "dealTo", required = false) String dealTimeTo,
  8. @RequestParam(value = "keywords", required = false) String shopNameOrKeywords,
  9. @RequestParam(value = "page", required = false) int pageId,
  10. @RequestParam(value = "pageSize", required = false) int pageSize,
  11. @RequestParam(value = "orderType", required = false) Long orderType) {
  12. }

3.2 @RequestBody形式

  1. @ResponseBody
  2. @RequestMapping(value = "synMeetSignInfor", method = RequestMethod.POST)
  3. public Result synMeetSignInfor(@RequestBody RpMeetingSign rpMeetingSign) {
  4. }

4.根据接口接收数据的形式,编写调用接口的代码

4.1 @RequestParam形式的接口调用可以采用Map装载param,调用url的形式进行,如:

  1. Map<String, String> param = Maps.newHashMap();
  2. param.put("productCode", productCode);
  3. param.put("strategyCode", strategyCode);
  4. HttpUtils.doRequest(params, "https://noob.test.za.net/groupApi/queryGroupByCode");

4.2 @RequestBody形式接口的调用,由于是序列化的实体接口,所以可以采用拼接json的格式进行传参

  1. JSONObject result = new JSONObject();
  2. result.put("phone", meetingSign.getNewPhone());
  3. result.put("signinName", meetingSign.getNewSigninName());
  4. Date currentTime = meetingSign.getNewCheckinTime();
  5. result.put("checkinTime", currentTime);
  6. result.put("checkinPosition", meetingSign.getNewCheckinPosition());
  7. result.put("actCode", meetingSign.getNewName());
  8. result.put("meetingDistance", meetingSign.getDistance());
  9. result.put("openid",openId);
  10. if(meetingSign.getDistance()>redDistance){
  11. result.put("isIntime", 1);
  12. }else{
  13. result.put("isIntime", 0);
  14. }
  15. String body = "" + result;
  16. // 3.接口请求方法
  17. String resultStr = HttpPostUtil.httpClientDoPost(dtUrl, body);

但是,这两种数据传参形式,都需注意的一个点:数据类型的一致性,就是如果这个字段目标接口是以Date的形式接口,那么你就不能以String的形式传递,不然就会报错:

  1. 返回结果:<html><head><title>Apache Tomcat/7.0.79 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 400 - </h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>The request sent by the client was syntactically incorrect.</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/7.0.79</h3></body></html>
  2. [ERROR][2020/05/30 15:56:190 ][com.jerehsoft.ec.web.mvc.GlobalHandlerExceptionResolver.resolveException(GlobalHandlerExceptionResolver.java:29)]
  3. A JSONObject text must begin with '{' at character 1 of <html><head><title>Apache Tomcat/7.0.79 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 400 - </h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>The request sent by the client was syntactically incorrect.</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/7.0.79</h3></body></html>
  4. com.jerehsoft.model.exception.TxException: net.sf.json.JSONException: A JSONObject text must begin with '{' at character 1 of <html><head><title>Apache Tomcat/7.0.79 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 400 - </h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>The request sent by the client was syntactically incorrect.</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/7.0.79</h3></body></html>
  5. at com.jerehsoft.ec.web.mvc.GlobalHandlerExceptionResolver.resolveException(GlobalHandlerExceptionResolver.java:29)
  6. at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1141)
  7. at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:979)
  8. at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:933)
  9. at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:851)
  10. at com.jerehsoft.ec.web.mvc.DispatcherServlet.doService(DispatcherServlet.java:14)
  11. at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953)
  12. at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855)
  13. at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
  14. at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)
  15. at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
  16. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
  17. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  18. at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
  19. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  20. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  21. at com.jerehsoft.ec.web.filter.WeixinAuthFilter.doFilter(WeixinAuthFilter.java:79)
  22. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  23. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  24. at com.jerehsoft.web.common.filter.MemberAttachFilter.doFilter(MemberAttachFilter.java:37)
  25. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  26. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  27. at com.jerehsoft.web.common.filter.XssFilter.doFilter(XssFilter.java:32)
  28. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  29. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  30. at com.jerehsoft.web.common.filter.EncodingFilter.doFilter(EncodingFilter.java:23)
  31. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  32. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  33. at com.jerehsoft.web.common.filter.ContextWrappingFilter.doFilter(ContextWrappingFilter.java:33)
  34. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  35. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  36. at com.jerehsoft.web.common.filter.ThreadContextFilter.doFilter(ThreadContextFilter.java:23)
  37. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  38. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  39. at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
  40. at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
  41. at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
  42. at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
  43. at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
  44. at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:660)
  45. at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
  46. at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
  47. at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798)
  48. at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
  49. at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:808)
  50. at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
  51. at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
  52. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  53. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  54. at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
  55. at java.lang.Thread.run(Thread.java:748)
  56. Caused by: net.sf.json.JSONException: A JSONObject text must begin with '{' at character 1 of <html><head><title>Apache Tomcat/7.0.79 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 400 - </h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>The request sent by the client was syntactically incorrect.</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/7.0.79</h3></body></html>
  57. at net.sf.json.util.JSONTokener.syntaxError(JSONTokener.java:505)
  58. at net.sf.json.JSONObject._fromJSONTokener(JSONObject.java:1144)
  59. at net.sf.json.JSONObject._fromString(JSONObject.java:1373)
  60. at net.sf.json.JSONObject.fromObject(JSONObject.java:161)
  61. at net.sf.json.JSONObject.fromObject(JSONObject.java:130)
  62. at com.jerehsoft.ec.meetingsign.service.impl.MeetingSignServiceImpl.sendDtMeetingSgin(MeetingSignServiceImpl.java:118)
  63. at com.jerehsoft.ec.meetingsign.service.impl.MeetingSignServiceImpl.addMeetingSign(MeetingSignServiceImpl.java:57)
  64. at com.jerehsoft.ec.act.controller.MeetingSignFWHController.newsView(MeetingSignFWHController.java:220)
  65. at com.jerehsoft.ec.act.controller.MeetingSignFWHController$$FastClassBySpringCGLIB$$ae635c58.invoke(<generated>)
  66. at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
  67. at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:700)
  68. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
  69. at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91)
  70. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
  71. at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:633)
  72. at com.jerehsoft.ec.act.controller.MeetingSignFWHController$$EnhancerBySpringCGLIB$$f9110e9d.newsView(<generated>)
  73. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  74. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  75. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  76. at java.lang.reflect.Method.invoke(Method.java:498)
  77. at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
  78. at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
  79. at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
  80. at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:743)
  81. at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:672)
  82. at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:82)
  83. at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:919)

报错核心提取:

  1. <html><head><title>Apache Tomcat/7.0.79 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 400 - </h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>The request sent by the client was syntactically incorrect.</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/7.0.79</h3></body></html>

最核心部分:

  1. The request sent by the client was syntactically incorrect

由于参数格式错误,服务器才会报出HTTP 400的错误代码和“The request sent by the client was syntactically incorrect”的错误信息。对照接口文档,发现redLoad字段目标接口定义是Date,而这边传的是String类型,最后将redLoad字段转换为Date,即可成功解决问题。

发表评论

表情:
评论列表 (有 0 条评论,68人围观)

还没有评论,来说两句吧...

相关阅读

    相关 zipkin

    踩坑总结(针对kafka方式) 1. 千万不要使用网上的zipkin资料搭建,都是坑 2. spring cloud官方文档上也有一些问题。不过重要的点是,官网上...

    相关 SonarQube

    Sonarqube 是个自动化 review 工具,研发人员的好帮手。我在部署和应用 Sonarqube 对.Net 项目进行分析时遇到了不少问题,现在记录并分享一下,希望能帮

    相关 GreenDao

    GreenDao踩坑记 前言 以前都是自己写SQLite的dao,然后自己写sql语句,自己管理.最近发现一款开源库比较火,已经被开发者广泛使用.入门简单,不用再写

    相关 Vue

    一、Vue实例 > 生命周期钩子 在开发程序的时候,有时候喜欢先不写实现,先将组成的部分定义好,但在写Vue生命周期钩子的时候出现了错误。错误信息vue.es

    相关 Javascript

    字符串 比较大小 JavaScript支持字符串比较大下,但如果想比较的字符串内容是数字,可能会出现问题,因为它是按照每个字符的`charCode`进行比较的。比如