精华内容
下载资源
问答
  • Java 接口请求异步响应

    万次阅读 2018-01-08 17:38:56
    所以需要在接口请求过来,就先响应,再去执行业务逻辑。 1.创建一个Controller类用来接收接口请求 @RestController @RequestMapping("/test") public class Controller { private static Logger log = Logg

    背景:接口请求的时候如果是同步,那么有时业务逻辑处理时间很长,请求就会超时!
    所以需要在接口请求过来时,就先响应,再去执行业务逻辑。

    1.创建一个Controller类用来接收接口请求
    @RestController
    @RequestMapping("/test")
    public class Controller {
    private static Logger log = LoggerFactory.getLogger(WelfarepriceController.class);
    //创建线程池
    private static ScheduledExecutorService executor = Executors.newScheduledThreadPool(5)


    @RequestMapping(value="init",method = RequestMethod.POST)
    public AjaxResult init(@RequestBody String json){
    AjaxResult result = new AjaxResult();

    //方法加入到线程池中去执行
    executor.execute(new ToServer(json)));
    //返回响应结果
    result.setRetcode(0);
    result.setRetmsg("成功");
    return result;
    }

    }


    2.再建线程类
    public class ToServer extends Thread {
        private String json;
        //需要什么参数就自己定义
        public ToServer(String json) {
            this.json = json;
        }
         /**
         * 执行定时请求
         */
        @Override
        public void run() {
             // 把run方法里的内容换成你要执行的内容               
      service.doService(json);      
        }
    }

    如果你是湖南的 欢迎加入 湖南人在深圳-Java群:557651502

    展开全文
  • JAVA HTTP POST请求(请求参数格式为json)

    万次阅读 2017-04-21 11:18:07
    JAVA HTTP POST请求(请求参数格式为json)
    public static String JsonSMS(String postData, String postUrl) {
        try {
            //发送POST请求
            URL url = new URL(postUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("Connection", "Keep-Alive");
            conn.setUseCaches(false);
            conn.setDoOutput(true);
            conn.setRequestProperty("Content-Length", "" + postData.length());
            OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
            out.write(postData);
            out.flush();
            out.close();
            //获取响应状态
            if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
                System.out.println("connect failed!");
                return "";
            }
            //获取响应内容体
            String line, result = "";
            BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
            while ((line = in.readLine()) != null) {
                result += line + "\n";
            }
            in.close();
            return result;
        } catch (IOException e) {
            e.printStackTrace(System.out);
        }
        return "";
    }
    展开全文
  • 方便在后台日志直接看到请求参数等信息,可以快速定位bug原因 @Aspect @Configuration @Slf4j public class LogAspect { @Autowired private RedisOperate redisOperate; @Pointcut("execution(* ...

    方便在后台日志直接看到请求参数等信息,可以快速定位bug原因

    @Aspect
    @Configuration
    @Slf4j
    public class LogAspect {
        @Autowired
        private RedisOperate redisOperate;
        @Pointcut("execution(* com.dkdy.goodsserver.controller.*Controller.*(..))")
        public void excudeService() {
        }
        @Around("excudeService()")
        public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
            RequestAttributes ra = RequestContextHolder.getRequestAttributes();
            ServletRequestAttributes sra = (ServletRequestAttributes) ra;
            HttpServletRequest request = sra.getRequest();
            Enumeration<String> headerNames = request.getHeaderNames();
            Map<String, Object> headerMap = new HashMap<> (10);
            do {
                String header = headerNames.nextElement();
                headerMap.put(header, request.getHeader(header));
            } while (headerNames.hasMoreElements());
    
    
            String token = request.getParameter("token");
            if (StringUtil.isEmpty(token)) {
                token = request.getHeader("token");
                if (StringUtil.isEmpty(token)) {
                    token = RequestUtil.getCookieValue(request, "token");
                }
            }
            long start=System.currentTimeMillis ();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            log.info("***************************start "+sdf.format(start)+" *************************************************");
            Object userObject = null;
            userObject = redisOperate.getByKey("token:" + token);
            String method = request.getMethod();
            String uri = request.getRequestURI();
            String paraString = JSON.toJSONString(request.getParameterMap());
            String current = sdf.format(System.currentTimeMillis());
            log.info("\n" +
                            "请求地址  >>>  {}\n" +
                            "请求方法  >>>  {}\n" +
                            "请求参数  >>>  {}\n" +
                            "请求来源  >>>  {}\n" +
                            "内容类型  >>>  {}\n" +
                            "用户令牌  >>>  {}\n" +
                            "用户实例  >>>  {}\n" +
                            "请求头部  >>>  {}\n",
                    request.getRequestURI(),
                    request.getMethod(),
                    JSONUtil.toJSON(request.getParameterMap()),
                    request.getRemoteAddr(),
                    request.getContentType(),
                    token,
                    accountId,
                    JSON.toJSONString(headerMap));
    //        log.info("请求开始, URI: {}, method: {}, params: {}", uri, method, paraString);
            Object result = pjp.proceed();
            long end=System.currentTimeMillis ();
            log.info("\n"+
                    "请求结束"+uri+" "+sdf.format(end)+"耗时 "+(end-start)+"ms"+"\n"+
                     JSON.toJSONString(result,true));
    //        log.info("请求结束,controller的返回值是 " + result);
    //        log.info("请求结束,controller的返回值是 " + JSON.toJSON (result));
            log.info("***************************end   "+sdf.format(end)+"耗时 "+(end-start)+"ms");
            return result;
        }
    
    }
    

    添加全局拦截器校验token

    @Slf4j
    @Component
    public class
    RequestTokenInterceptor extends HandlerInterceptorAdapter {
    
        @Autowired
        private RedisOperate redisOperate;
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            if (URLFilter.handle(request.getRequestURI())) {
                return true;
            }
            Enumeration<String> headerNames = request.getHeaderNames();
            Map<String, Object> headerMap = Maps.newHashMapWithExpectedSize(10);
            do {
                String header = headerNames.nextElement();
                headerMap.put(header, request.getHeader(header));
            } while (headerNames.hasMoreElements());
    
    
            String token = request.getParameter("token");
            if (StringUtil.isEmpty(token)) {
                token = request.getHeader("token");
                if (StringUtil.isEmpty(token)) {
                    token = RequestUtil.getCookieValue(request, "token");
                }
            }
            Object userObject = null;
            userObject = redisOperate.getByKey("token:" + token);
            Long accountId = null;
            if (userObject != null) {
                accountId = ((CurrentUser) userObject).getAccount_id();
            }
    
            log.info("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-■GOODS SERVICE■-=-=-=-=-=-=-=-=-=-=-=-=-=-\n" +
                            "请求地址  >>>  {}\n" +
                            "请求方法  >>>  {}\n" +
                            "请求参数  >>>  {}\n" +
                            "请求来源  >>>  {}\n" +
                            "内容类型  >>>  {}\n" +
                            "用户令牌  >>>  {}\n" +
                            "用户实例  >>>  {}\n",
                    request.getRequestURI(),
                    request.getMethod(),
                    JSONUtil.toJSON(request.getParameterMap()),
                    request.getRemoteAddr(),
                    request.getContentType(),
                    token,
                    accountId
                    //JSON.toJSONString(headerMap)
            );
            return true;
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
        }
    }
    
    
    展开全文
  • 利用AOP监控Java接口响应超时

    千次阅读 2018-10-11 20:47:06
     服务化接口是提供服务的,接口正确性、稳定性是最最重要的,在保证正确的同时需要尽量提高接口响应时间。  有的团队会有专门的工具来对系统响应时间、吞吐量做监控,但如果团队没有这种“待遇”就需要自己来做...

     

    为什么要监控

      服务化接口是提供服务的,接口正确性、稳定性是最最重要的,在保证正确的同时需要尽量提高接口响应时间。

      有的团队会有专门的工具来对系统响应时间、吞吐量做监控,但如果团队没有这种“待遇”就需要自己来做一些工具为自己的代码提供服务。

    自己动手,丰衣足食

      AOP + Annotation 简陋实现,能达到目的

      AOP : 使用环绕方式对接口拦截,在拦截接口前后记录时间最后计算用时

      Annotation : 自定义注解在接口上设置超时时间(timeout)和超时是否发送邮件选项(emailIfTimeout)

      通过对接口实际执行时间和配置的超时时间比较,系统可以计算出接口是否超时,此时可使用日志(或其他能通知到开发人员的方式)记录具体哪个接口、什么参数以及执行时间

      注解可以提供更多的选项,来为自己接口服务,比如支持注解到类上,批量为接口设置了默认超时时间、支持日志中显示的处理方法名称 等等...

    代码实施

    接口Annotation定义

    package opsteel.oupuzw.web.logistics.bean;
    
    import org.springframework.core.annotation.AliasFor;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**
     * 创建自定义注解输出接口耗时(@PrintCostTime)
     * create on 2018-08-08
     * @author Yesh
     */
    @Target({ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface PrintCostTime {
    
        /** 输出方法名称 **/
        @AliasFor("name")
        String name() default "";
    
        /**
         * 接口超时时间,单位毫秒.默认值100毫秒
         * @return 设置的超时时间
         */
        int timeout() default 100;
    
        /**
         * 注解上的打印参数
         * @return 输出的时候打印出来
         */
        String[] printArgs() default {};
    
        /**
         * 是否开启日志监控功能默认开
         * @return 返回ture需要发送邮件
         */
        boolean enablePrint() default true;
    
        /**
         * 是否允许打印在默认列表里的参数(默认 true)
         * @return
         */
        boolean enablePrintDefaultArgs() default true;
    
        /**
         * 当接口响应超时时,是否发送邮件.默认发送
         * @return 返回ture需要发送邮件
         */
        boolean emailIfTimeout() default true;
    }
    
    package opsteel.oupuzw.web.logistics.bean;
    
    import lombok.extern.log4j.Log4j;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.reflect.MethodSignature;
    import org.springframework.stereotype.Component;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.stream.Collectors;
    
    /**
     * 日志AOP监控接口响应时长
     * create on 2018-08-08
     *
     * @author Yesh
     */
    @Component
    @Aspect
    @Log4j
    public class PrintCostTimeAspect {
    
        @Around("@annotation(opsteel.oupuzw.web.logistics.bean.PrintCostTime)")
        public Object aroundPrintCostTime(ProceedingJoinPoint pjp) throws Throwable {
            MethodSignature signature = (MethodSignature) pjp.getSignature(); //方法签名
            PrintCostTime printCostTime = signature.getMethod().getAnnotation(PrintCostTime.class);//从签名注解中获取注解内容配置项
            String methodCName = printCostTime.name();//方法中文名称[注解中获取 不填写 为""]
            String methodName = signature.getName();
            //        Class clazz = pjp.getTarget().getClass();  //取拦截的Class
            //RequestMapping requestMapping = signature.getMethod().getAnnotation(RequestMapping.class);//从这里可以获取 请求地址
            //方法名和参数值
            //String[] ArgsNames = signature.getParameterNames();
            //Object[] argsValue = pjp.getArgs();
            //参数打印目前没必要 result 中可以获取 返回的json值
    //        String argsLog = getArgsLog(printCostTime, ArgsNames, argsValue);
    
            long start = System.currentTimeMillis();  //开始时间
            Object[] args = pjp.getArgs(); //取拦截的Args
            Object result = pjp.proceed(args);  //运行被拦截的方法
            if (printCostTime.enablePrint()==false){ //若开关为 true 开启打印
                return result;
            }
    
            long end = System.currentTimeMillis();
            long diff = end - start;//计算耗时
    
            //若超过配置的阀值则打印耗时日志
            long thresholdInMs = printCostTime.timeout();
            if (diff >= thresholdInMs) {
                log.info(methodCName + ":[" + methodName + "]" + ",响应时间: " + diff + " ms");
                //发邮件发作即可
            }
            return result;
        }
    
    }
    

     

    @PrintCostTime(name = "XXX")

    在Controller注解上即可描述当前接口花费时间

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • Java web 中web服务器对于请求参数可以使用request.setCharacter(“”)方法对其进行编码,但是这种方式只会对请求的body部分进行编码解析,对于url中的参数不做处理。 而浏览器默认会使用ISO-8859-1对请求中的...
  • 这里写自定义目录标题java实现调用第三方接口post请求上传文件请求参数为MultipartFile携带token的解决方案 java实现调用第三方接口post请求上传文件请求参数为MultipartFile携带token的解决方案 控制器层: /** * ...
  • 1、前端在请求时遇到跨域请求,连续的请求之间需要携带上一次的Cookie,前端不便于实现。 2、所以需要后端实现Cookie的获取请求携带,实现请求服务的代理请求。 可行性分析 1、 cookie (储存在用户本地终端...
  • HttpServletRequest对象概述 ...由于HTTP请求消息分为请求行、请求消息头和请求消息体三部分,因此,在HttpServletRequest接口中定义了获取请求行、请求头和请求消息体的相关方法。 我们在创建Servlet会覆盖serv...
  • 但是在实际开发需求中,比如我们的安卓程序需要从服务器获取数据,我们就需要利用java代码来发送http请求,这个时候就需要使用一个插件,这个老版本叫httpClient,这个不怎么好用, 现在大部分使用okhttp ...
  • 获取浏览器Network请求响应 Selenium-获取请求接口数据信息 Browsermob-Proxy是一个开源的Java编写的基于LittleProxy的代理服务。Browsermob-Proxy的具体流程有点类似与Flidder或Charles。即开启一个端口并...
  • java filter打印请求返回参数
  • java响应重定向发送post请求

    千次阅读 2019-11-02 22:48:37
    但有时候请求地址必须为post请求,比如security登录就只能接收post请求,下面来看一下如何后台如何发送post请求响应重定向。 首先可以定义一个map,用于存放参数键值对 Map<String, String> parameter =...
  • 通过java发送post请求参数为json格式

    万次阅读 2019-04-10 13:13:39
    通过java发送post请求参数为json格式 java模拟post请求发送json,用两种方式实现,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求。我使用的是第二种方法,下面是具体代码。 import ...
  • 这次做周边疫情模块的时候需要传入省份城市地区三个中文参数java后端打印请求字符串一切都是正常的但是提交总是返回250 通过接口平台后台查看发现提交的字符串中文竟然是乱码然后开始各种修改编码 刚开始尝试修改...
  • 获取浏览器Network请求响应 Selenium-获取请求接口数据信息 Browsermob-Proxy是一个开源的Java编写的基于LittleProxy的代理服务。Browsermob-Proxy的具体流程有点类似与Flidder或Charles。即开启一个端口并...
  • 公司要求采集项目api接口信息(请求地址、请求参数响应时间等),便于后期业务优化 2.实现方案 采用filter拦截器实现采集日志,后来发现有两个问题需要解决,1、filter读取IO流信息后,不能再被Controller获得...
  • 最近有一个需要从接口请求参数后,打印日志,进行接口参数记录。 这里记录一下处理过程中出现的问题。 首先想到的就是request.getParameter(String )方法,但是这个方法只能在get请求中取到参数,post是不行的,...
  • java请求PHP接口

    千次阅读 2015-07-15 15:20:47
    /** * 请求PHP接口 * @param pathUrl 接口地址...* @param params 请求参数 * @return httpUrlConnection */ public String httpUrlConnection(String pathUrl, String params) { try { // 建立连接 URL url = n
  • swagger常用注解和获取请求参数注解

    千次阅读 2020-03-29 21:08:34
    swagger 注解 ... value="该参数没什么意义,在UI界面上也看到,所以不需要配置" @ApiOperation 用在请求的方法上,说明方法的用途、作用 value="说明方法的用途、作用" ...
  • 基于 Apache HttpClient 获取提交参数并获取网页 /* * 提供 url,param,charset * 返回字符串内容 * * // 设置访问的Web站点 // String path = ... // 设置Http请求参数 Map params = new HashMap();
  • java获取http请求头和设置http响应

    千次阅读 2020-06-29 19:08:39
    request得到请求header, request.getHeaderNames(); response设置响应头。 response.setHeader(name,value);//通用的设置响应头的方法 //有些响应头比较常用,如果使用response.setHeader(name,value);的方式...
  • Java 请求异步响应

    千次阅读 2018-10-08 14:54:35
    版权声明:本文为博主原创文章,未经博主允许不得转载。...所以需要在接口请求过来,就先响应,再去执行业务逻辑。(或者不是一个请求,一个方法里面两个无关的业务逻辑需要异步执行节省效率的也可以用这个方法,...
  • 我现在需要在服务器端获取地理位置信息,因此我通过java程序模拟HTTP请求,去访问AAA.JSP,但因为ajax是异步的,模拟程序访问该页面的时候,其中的ajax方法还没执行结束,服务器就返回了该页面的静态HTML内容,导致...
  • POST 请求参数java接收参数都为null

    千次阅读 2020-10-26 09:10:19
    post请求参数为json形式,java接收controller是@RestController注解,采用@RequestBody将参数转为bean,实际发现接收到的bean属性字段全部为null。 思路: 检查controller接收到的json是否正确, 网上搜这个...
  • Java获取Token,含Authorization参数以及body参数 代码如下: public String getAccesstoken () { String result = null; //请求地址 Properties pro = getProperties(); String url = pro.getProperty(&...
  • get请求 传递token */ static String doGet(String url,Map params,String token){ BufferedReader in = null; CloseableHttpResponse response=null; //1.创建HttpClient对象 CloseableHttpClient ...
  • //发送请求参数即数据 Gson gson=new Gson(); //传入的参数 String param=gson.toJson(map); //参数 out.print(param); //缓冲数据 out.flush(); //获取URLConnection对象对应的输入流 ...
  • java 模拟HTTP doPost请求 设置参数

    万次阅读 2011-01-20 11:31:00
    转自:http://winhonourxzg.javaeye.com/blog/461219<br />  请求模拟 package org.zlex.commons.net; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io....
  • SpringCloudGateway获取请求参数方式

    千次阅读 2020-05-23 21:19:02
    需要在网关打印请求日志, 其中需要获取POST请求请求参数 3.遇到的问题 按照网上查到的方案, 用在这个版本的cloud上, 全都不起作用; 请求体只能读取一次, 读取之后, 后续的过滤器将无法获取请求体数据; Spring...
  • 这个接口自动化测试框架到目前为止,我们已经完成了Get请求的封装和必要的工具类的支持。...所以,这个Java接口自动化测试框架的核心就是Get和POST请求方法的封装过程。 1.POST接口举例浏览器打开https://re...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 191,993
精华内容 76,797
关键字:

java接口响应时如何获取请求参数

java 订阅