接口联调踩坑记

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

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<String, String> 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的形式传递,不然就会报错:

返回结果:<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>
 [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 <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>
 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>
	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 <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>
	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(<generated>)
	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(<generated>)
	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)

报错核心提取:

<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>

最核心部分:

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潇潇雨歇_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值