栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Spring REST服务:从请求检索JSON

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring REST服务:从请求检索JSON

使用HttpServletRequest对象,你可以访问客户端用于发出请求的URL,使用的方法(GET,POST,PUT等),查询字符串和标头。

获取RequestBody可能会有些棘手,并且可能需要使用HttpServletRequestWrapper对象。由于请求正文只能被读取一次,因此你需要扩展包装器以访问它,以便你的目标控制器以后仍可以访问它,以将JSON反序列化为POJO对象。

public class MyRequestWrapper extends HttpServletRequestWrapper { private final String body; public MyRequestWrapper(HttpServletRequest request) throws IOException {   super(request);   StringBuilder stringBuilder = new StringBuilder();   BufferedReader bufferedReader = null;   try {     InputStream inputStream = request.getInputStream();     if (inputStream != null) {       bufferedReader = new BufferedReader(new InputStreamReader(inputStream));       char[] charBuffer = new char[128];       int bytesRead = -1;       while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {         stringBuilder.append(charBuffer, 0, bytesRead);       }     } else {       stringBuilder.append("");     }   } catch (IOException ex) {       throw ex;   } finally {     if (bufferedReader != null) {       try {         bufferedReader.close();       } catch (IOException ex) {         throw ex;       }     }   }   body = stringBuilder.toString(); } @Override public ServletInputStream getInputStream() throws IOException {   final ByteArrayInputStream byteArrayInputStream = new     ByteArrayInputStream(body.getBytes());   ServletInputStream servletInputStream = new ServletInputStream() {     public int read() throws IOException {       return byteArrayInputStream.read();     }   };   return servletInputStream; } @Override public BufferedReader getReader() throws IOException {   return new BufferedReader(new InputStreamReader(this.getInputStream())); } public String getBody() {   return this.body; }}

要在中央位置访问请求,可以使用过滤器或Spring拦截器。这两个请求都在将请求委派给控制器之前被调用,并且都可以访问servlet。

这是一个使用Spring Interceptor的实际记录示例:

package com.vaannila.interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.log4j.BasicConfigurator;import org.apache.log4j.Logger;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.handler. HandlerInterceptorAdapter;public class LoggerInterceptor extends HandlerInterceptorAdapter {    static Logger logger = Logger.getLogger(LoggerInterceptor.class);    static {        BasicConfigurator.configure();    }    @Override    public boolean preHandle(HttpServletRequest request,        HttpServletResponse response, Object handler) throws Exception {        logger.info("Before handling the request");        return super.preHandle(request, response, handler);    }    @Override    public void postHandle(HttpServletRequest request,        HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {        logger.info("After handling the request");        super.postHandle(request, response, handler, modelAndView);    }    @Override    public void afterCompletion(HttpServletRequest request,        HttpServletResponse response, Object handler, Exception ex) throws Exception {        logger.info("After rendering the view");        super.afterCompletion(request, response, handler, ex);    }}<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:p="http://www.springframework.org/schema/p"    xsi:schemaLocation="http://www.springframework.org/schema/beans    http://www.springframework.org/schema/beans/spring-beans.xsd">    <bean id="viewResolver"  p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />    <bean id="handlerMapping"  p:interceptors-ref="loggerInterceptor" />    <bean id="loggerInterceptor"  />    <bean id="userService"  />    <bean name="/userRegistration.htm"  p:userService-ref="userService" p:formView="userForm" p:successView="userSuccess" /></beans>

在LoggerInterceptor中,你可以使用以下代码访问请求:

MyRequestWrapper myRequestWrapper = new MyRequestWrapper((HttpServletRequest) request);String body = myRequestWrapper.getBody();String clientIP = myRequestWrapper.getRemoteHost();int clientPort = request.getRemotePort();String uri = myRequestWrapper.getRequestURI();System.out.println(body);System.out.println(clientIP);System.out.println(clientPort);System.out.println(uri);


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/411223.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号