zoukankan      html  css  js  c++  java
  • 使用feign封装第三方Http接口,请求出现400

    调用第三方接口,传输二字节流,每次批量传输都有一部分传输失败,接口响应超时,返回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;
        }

    记录一下,具体原因不是很明白!!!

  • 相关阅读:
    PAIRING WORKFLOW MANAGER 1.0 WITH SHAREPOINT 2013
    Education resources from Microsoft
    upgrade to sql server 2012
    ULSViewer sharepoint 2013 log viewer
    Top 10 Most Valuable Microsoft SharePoint 2010 Books
    讨论 Setsockopt选项
    使用 Alchemy 技术编译 C 语言程序为 Flex 可调用的 SWC
    Nagle's algorithm
    Nagle算法 TCP_NODELAY和TCP_CORK
    Design issues Sending small data segments over TCP with Winsock
  • 原文地址:https://www.cnblogs.com/qqq9527/p/11740521.html
Copyright © 2011-2022 走看看