调用第三方接口,传输二字节流,每次批量传输都有一部分传输失败,接口响应超时,返回400,不管修改超时时间多久都不成功
一.使用feign方式
接口调用使用feign包装第三方接口
@FeignClient(name = "xxx-service", url = "${url}", configuration = { FeignClientConfig.class }) public interface ServiceFeign { @RequestMapping(value = "${a.url}", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public AResponse getA(ARequest request); }
调用位置
public class TestA{ @Autoware private ServiceFeign serviceFeign; public xx methodA(xxx){ serviceFeign.getA(xxx); } }
开启feign日志发现报400,第三方无响应返回
怀疑时feign的问题故换成http的:
/** * 以HTTP post方式访问指定URL * @param url 访问URL * @param jsonObject json对象 * @return 服务器响应内容 */ public static String jsonPost(String url, String jsonObject) { PostMethod method = new PostMethod(url); String body = null; if (StringUtils.isNotBlank(jsonObject)) { try { method.addRequestHeader("Content-type", "application/json; charset=utf-8"); method.addRequestHeader("Accept", "text/xml,text/javascript,text/html,application/json"); RequestEntity requestEntity = new StringRequestEntity(jsonObject, "application/json", "utf-8"); method.setRequestEntity(requestEntity); httpClient.executeMethod(method); InputStream inputStream = method.getResponseBodyAsStream(); BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); StringBuffer stringBuffer = new StringBuffer(); String str = ""; while ((str = br.readLine()) != null) { stringBuffer.append(str); } body = stringBuffer.toString(); log.info("http返回结果{}",body); } catch (Exception e) { log.error("连接异常:"+e.getMessage(),e); } finally { method.releaseConnection(); } } return body; }
发现还是一样的问题(fegin底层可能也是这种方式实现的),
最后解决方法:使用map方式成功了
/** * 以HTTP post方式访问指定URL * @param url 访问URL * @param paramData map对象 * @return 服务器响应内容 */ @SuppressWarnings("deprecation") public static String jsonPost(String url, Map<String, Object> paramData) { PostMethod method = new PostMethod(url); String body = null; if (method != null && paramData != null) { try { method.addRequestHeader("Content-type", "application/json; charset=utf-8"); method.addRequestHeader("Accept", "application/json"); String jsonObject = JSONObject.toJSONString(paramData); method.setRequestBody(jsonObject); httpClient.executeMethod(method); log.info("http-jsonPost-jsonObject:" + method.getResponseBodyAsString()); InputStream inputStream = method.getResponseBodyAsStream(); BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); StringBuffer stringBuffer = new StringBuffer(); String str = ""; while ((str = br.readLine()) != null) { stringBuffer.append(str); } body = stringBuffer.toString(); }catch(SocketTimeoutException te){ log.error("连接超时:"+te.getMessage()); }catch (Exception e) { log.error("连接异常:"+e.getMessage(),e); } finally { method.releaseConnection(); } } return body; }
记录一下,具体原因不是很明白!!!