接口联调踩坑记

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

1.所调接口网络不通

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

测试对接的目标接口网络
#telnet命令
telnet 域名/IP 端口
如: telnet xxx.xxx.com 443

#ping 命令
ping IP/域名
如: ping www.baidu.com

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

 

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

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

 

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

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

接收形式例子:

3.1 @RequestParam形式

@ResponseBody
@RequestMapping(value = "doListOrder", method = {RequestMethod.GET, RequestMethod.POST}, produces = MediaType.APPLICATION_JSON_VALUE)
    public Object doListOrder(HttpServletRequest request,
                              @RequestParam(value = "status", required = false) String status,
                              @RequestParam(value = "commentStatus", required = false) String commentStatus,
                              @RequestParam(value = "dealFrom", required = false) String dealTimeFrom,
                              @RequestParam(value = "dealTo", required = false) String dealTimeTo,
                              @RequestParam(value = "keywords", required = false) String shopNameOrKeywords,
                              @RequestParam(value = "page", required = false) int pageId,
                              @RequestParam(value = "pageSize", required = false) int pageSize,
                              @RequestParam(value = "orderType", required = false) Long orderType) {



}

3.2 @RequestBody形式

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


}

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

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

Map param = Maps.newHashMap();
param.put("productCode", productCode);
param.put("strategyCode", strategyCode);
HttpUtils.doRequest(params, "https://noob.test.za.net/groupApi/queryGroupByCode");

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

JSONObject result = new JSONObject();
result.put("phone", meetingSign.getNewPhone());
result.put("signinName", meetingSign.getNewSigninName());
Date currentTime = meetingSign.getNewCheckinTime();
result.put("checkinTime", currentTime);
result.put("checkinPosition", meetingSign.getNewCheckinPosition());
result.put("actCode", meetingSign.getNewName());
result.put("meetingDistance", meetingSign.getDistance());
result.put("openid",openId);
if(meetingSign.getDistance()>redDistance){
   result.put("isIntime", 1);
}else{
      result.put("isIntime", 0);
}
String body = "" + result;
// 3.接口请求方法
String resultStr = HttpPostUtil.httpClientDoPost(dtUrl, body);

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

返回结果:Apache Tomcat/7.0.79 - Error report 

HTTP Status 400 -


type Status report

message

description The request sent by the client was syntactically incorrect.


Apache Tomcat/7.0.79

[ERROR][2020/05/30 15:56:190 ][com.jerehsoft.ec.web.mvc.GlobalHandlerExceptionResolver.resolveException(GlobalHandlerExceptionResolver.java:29)] A JSONObject text must begin with '{' at character 1 of Apache Tomcat/7.0.79 - Error report

HTTP Status 400 -


type Status report

message

description The request sent by the client was syntactically incorrect.


Apache Tomcat/7.0.79

com.jerehsoft.model.exception.TxException: net.sf.json.JSONException: A JSONObject text must begin with '{' at character 1 of Apache Tomcat/7.0.79 - Error report

HTTP Status 400 -


type Status report

message

description The request sent by the client was syntactically incorrect.


Apache Tomcat/7.0.79

at com.jerehsoft.ec.web.mvc.GlobalHandlerExceptionResolver.resolveException(GlobalHandlerExceptionResolver.java:29) at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1141) at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:979) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:933) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:851) at com.jerehsoft.ec.web.mvc.DispatcherServlet.doService(DispatcherServlet.java:14) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855) at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.jerehsoft.ec.web.filter.WeixinAuthFilter.doFilter(WeixinAuthFilter.java:79) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.jerehsoft.web.common.filter.MemberAttachFilter.doFilter(MemberAttachFilter.java:37) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.jerehsoft.web.common.filter.XssFilter.doFilter(XssFilter.java:32) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.jerehsoft.web.common.filter.EncodingFilter.doFilter(EncodingFilter.java:23) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.jerehsoft.web.common.filter.ContextWrappingFilter.doFilter(ContextWrappingFilter.java:33) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.jerehsoft.web.common.filter.ThreadContextFilter.doFilter(ThreadContextFilter.java:23) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:660) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:808) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Caused by: net.sf.json.JSONException: A JSONObject text must begin with '{' at character 1 of Apache Tomcat/7.0.79 - Error report

HTTP Status 400 -


type Status report

message

description The request sent by the client was syntactically incorrect.


Apache Tomcat/7.0.79

at net.sf.json.util.JSONTokener.syntaxError(JSONTokener.java:505) at net.sf.json.JSONObject._fromJSONTokener(JSONObject.java:1144) at net.sf.json.JSONObject._fromString(JSONObject.java:1373) at net.sf.json.JSONObject.fromObject(JSONObject.java:161) at net.sf.json.JSONObject.fromObject(JSONObject.java:130) at com.jerehsoft.ec.meetingsign.service.impl.MeetingSignServiceImpl.sendDtMeetingSgin(MeetingSignServiceImpl.java:118) at com.jerehsoft.ec.meetingsign.service.impl.MeetingSignServiceImpl.addMeetingSign(MeetingSignServiceImpl.java:57) at com.jerehsoft.ec.act.controller.MeetingSignFWHController.newsView(MeetingSignFWHController.java:220) at com.jerehsoft.ec.act.controller.MeetingSignFWHController$$FastClassBySpringCGLIB$$ae635c58.invoke() at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:700) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:633) at com.jerehsoft.ec.act.controller.MeetingSignFWHController$$EnhancerBySpringCGLIB$$f9110e9d.newsView() at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:743) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:672) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:82) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:919)

报错核心提取:

Apache Tomcat/7.0.79 - Error report 

HTTP Status 400 -


type Status report

message

description The request sent by the client was syntactically incorrect.


Apache Tomcat/7.0.79

最核心部分:

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,即可成功解决问题。

 

你可能感兴趣的:(项目运维)