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

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

  • 相关阅读:
    一起学Windows phone 7开发(四. DeepZoom)
    设计模式Observer(观察者模式)
    今天挺开心
    设计模式Singleton(单例模式)
    PointFromScreen和PointFromScreen的用法和区别
    设计模式Adapter(适配器模式)
    设计模式Abstract Factory(抽象工厂)
    C++多线程信号量,互斥
    linux bash 几个命令
    大小端存储
  • 原文地址:https://www.cnblogs.com/qqq9527/p/11740521.html
Copyright © 2011-2022 走看看