Spring如何返回jsonp

fiy 其他 29

回复

共3条回复 我来回复
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Spring框架提供了多种方式可以返回 JSONP(JSON with Padding),下面将介绍其中两种常用的方法。

    方法一:使用@ResponseBody注解

    1. 在Spring MVC的控制器方法中使用@ResponseBody注解来指定返回的数据是JSON格式的。
    2. 设置响应的MediaType为application/javascript,即JSONP。
    3. 在方法上使用@RequestParam注解来接收callback参数,该参数为返回结果的回调函数名。

    示例代码如下:

    @Controller
    public class JsonpController {
        @RequestMapping(value="/data", method=RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE)
        @ResponseBody
        public String getData(@RequestParam("callback") String callback) {
            // 处理数据逻辑,生成JSON数据
            String jsonData = "{ \"name\": \"John\", \"age\": 30 }";
            // 将JSON数据包装为JSONP格式
            String jsonpResponse = callback + "(" + jsonData + ")";
            return jsonpResponse;
        }
    }
    

    方法二:使用MappingJackson2JsonView视图

    1. 使用MappingJackson2JsonView视图将数据转换成JSON格式。
    2. 在配置文件中配置bean,将MappingJackson2JsonView指定为viewClass,并设置返回的ContentType为application/javascript。

    示例代码如下:

    @Configuration
    @EnableWebMvc
    public class WebConfig implements WebMvcConfigurer {
        @Bean
        public MappingJackson2JsonView jsonpView() {
            MappingJackson2JsonView view = new MappingJackson2JsonView();
            view.setJsonPrefix("callback(");
            view.setJsonSuffix(")");
            return view;
        }
    
        @Override
        public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
            configurer.defaultContentType(MediaType.APPLICATION_JSON)
                .mediaType("jsonp", MediaType.APPLICATION_JSON);
        }
    }
    
    @Controller
    public class JsonpController {
        @RequestMapping(value="/data", method=RequestMethod.GET)
        public ModelAndView getData(ModelAndView modelAndView) {
            // 处理数据逻辑,生成JSON数据
            Map<String, Object> data = new HashMap<>();
            data.put("name", "John");
            data.put("age", 30);
            // 将数据传递给视图
            modelAndView.setViewName("jsonpView");
            modelAndView.addObject("data", data);
            return modelAndView;
        }
    }
    

    以上是Spring框架返回JSONP的两种常用方法,请根据实际需求选择合适的方式进行处理。

    1年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Spring框架为开发者提供了多种返回JSONP的方式。JSONP是一种基于JSON的跨域数据通信方式,可以通过动态地在被调用的页面中插入一个script标签,将数据返回给前端页面。

    下面是几种实现JSONP返回的方法:

    1. 使用Spring框架内置的JsonpCallbackResponseBodyAdvice类:
      Spring框架提供了一个JsonpCallbackResponseBodyAdvice类,可以方便地实现JSONP返回数据。首先需要配置一个继承了AbstractMappingJacksonResponseBodyAdvice类的类,然后重写beforeBodyWrite方法,在该方法中进行JSONP回调函数的处理。

      @ControllerAdvice
      public class JsonpAdvice extends AbstractMappingJacksonResponseBodyAdvice {
        
          @Override
          protected void beforeBodyWriteInternal(
              MappingJacksonValue bodyContainer,
              MediaType contentType,
              MethodParameter returnType,
              ServerHttpRequest request,
              ServerHttpResponse response) {
              HttpServletRequest servletRequest = ((ServletServerHttpRequest) request).getServletRequest();
              String callback = servletRequest.getParameter("callback");
              if (callback != null) {
                  // 添加JSONP回调函数
                  bodyContainer.setJsonpFunction(callback);
              }
          }
      }
      
    2. 使用@ResponseBody注解:
      在Spring的控制器方法上添加@ResponseBody注解,返回的结果将会自动转换为JSON格式,并且Spring会根据请求的方式自动选择返回JSON还是返回JSONP。如果请求参数中包含callback参数,Spring将会自动将数据返回为JSONP格式。

      @RequestMapping("/data")
      @ResponseBody
      public Object getData(HttpServletRequest request) {
          String callback = request.getParameter("callback");
          if (callback != null) {
              // 返回JSONP格式数据
              return new JsonpResponse(callback, data);
          } else {
              // 返回JSON格式数据
              return data;
          }
      }
      
    3. 使用自定义的返回类型:
      可以在Spring的控制器方法中返回一个自定义的类型,该类型必须包含一个callback参数和一个data参数,用于接收JSONP请求中的回调函数和数据。然后在控制器方法中判断是否存在callback参数,根据是否存在来决定返回JSON还是返回JSONP。

      public class JsonpResponse {
          private String callback;
          private Object data;
        
          // 构造方法和getter、setter方法省略
        
      }
      
      @RequestMapping("/data")
      public JsonpResponse getData(HttpServletRequest request) {
          String callback = request.getParameter("callback");
          if (callback != null) {
              // 返回JSONP格式数据
              return new JsonpResponse(callback, data);
          } else {
              // 返回JSON格式数据
              return new JsonpResponse(null, data);
          }
      }
      
    4. 使用HttpServletResponse对象:
      在Spring的控制器方法中,可以通过HttpServletResponse对象的方法来设置返回的Content-Type和数据体,并将数据返回给前端。

      @RequestMapping("/data")
      public void getData(HttpServletResponse response) throws IOException {
          String callback = request.getParameter("callback");
          if (callback != null) {
              // 返回JSONP格式数据
              response.setContentType("application/javascript");
              response.getWriter().write(callback + "(" + data + ")");
          } else {
              // 返回JSON格式数据
              response.setContentType("application/json");
              response.getWriter().write(data);
          }
      }
      
    5. 使用@ResponseBody和@PathVariable注解:
      如果想在URL路径中动态地包含回调函数的名称,可以使用@ResponseBody注解和@PathVariable注解来获取回调函数的名称,并根据该名称将数据返回为JSONP格式。

      @RequestMapping("/data/{callback}")
      @ResponseBody
      public Object getData(@PathVariable("callback") String callback) {
          if (callback != null) {
              // 返回JSONP格式数据
              return new JsonpResponse(callback, data);
          } else {
              // 返回JSON格式数据
              return data;
          }
      }
      

    通过以上几种方式,开发者可以灵活地实现在Spring框架中返回JSONP格式的数据,以满足前端页面对跨域数据通信的需求。

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Spring框架提供了多种方式用于返回JSONP(JSON with Padding)格式的数据。JSONP是一种用于解决跨域请求的方法,允许网页从不同的域名请求数据。在Spring中返回JSONP数据有以下几种常用的方式:

    1. 使用@ResponseBody注解

    使用@ResponseBody注解将返回结果直接转换为JSON格式数据。同时,在方法上使用@RequestMapping注解指定请求路径和请求方法。

    @Controller
    @RequestMapping("/api")
    public class ApiController {
        
        @RequestMapping(value = "/getData", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
        @ResponseBody
        public String getData() {
            // 获取数据
            Map<String, String> data = new HashMap<>();
            data.put("name", "John");
            data.put("age", "25");
            
            // 将数据转换为JSON字符串
            String json = new Gson().toJson(data);
            
            // 返回JSONP数据
            String callback = request.getParameter("callback");
            String jsonp = callback + "(" + json + ")";
            
            return jsonp;
        }
    }
    

    上述代码中,@RequestMapping注解指定了请求路径为/api/getData,请求方法为GET。@ResponseBody注解告诉Spring将返回结果转换为JSON格式。在方法中,先获取数据并将其转换为JSON字符串,然后将JSON字符串与回调函数名拼接成JSONP格式的响应数据。

    1. 使用MappingJackson2JsonView

    MappingJackson2JsonView是Spring框架提供的一个View实现类,可以将模型数据转换为JSON格式。通过配置一个返回ModelAndView对象的方法,可以在方法中指定使用MappingJackson2JsonView,并将要返回的数据设置为模型属性。

    在配置文件(如XML配置文件、Java配置类)中添加配置:

    @Bean
    public MappingJackson2JsonView jsonView() {
        MappingJackson2JsonView view = new MappingJackson2JsonView();
        view.setPrettyPrint(true);
        return view;
    }
    
    @Bean
    public ContentNegotiatingViewResolver viewResolver() {
        ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();
        resolver.setDefaultViews(Collections.singletonList(jsonView()));
        return resolver;
    }
    

    保证配置文件中已经启用了注解驱动。

    使用MappingJackson2JsonView返回JSONP数据:

    @Controller
    public class ApiController {
        
        @RequestMapping("/api/getData")
        public ModelAndView getData(HttpServletRequest request) {
            // 获取数据
            Map<String, String> data = new HashMap<>();
            data.put("name", "John");
            data.put("age", "25");
            
            // 将数据设置为模型属性
            ModelAndView mav = new ModelAndView();
            mav.addObject("data", data);
            
            // 设置JSONP回调函数名
            String callback = request.getParameter("callback");
            mav.addObject("callback", callback);
            
            // 设置视图为MappingJackson2JsonView
            mav.setViewName("jsonView");
            
            return mav;
        }
    }
    

    在上述代码中,首先配置了一个名为jsonViewMappingJackson2JsonView实例,并设置了prettyPrint为true以便使返回的JSON数据格式化。然后配置了一个名为viewResolverContentNegotiatingViewResolver实例,并将jsonView添加到默认视图列表中。

    getData方法中,首先获取数据并将其设置为模型属性。然后通过request.getParameter获取回调函数名,并将其也设置为模型属性。最后,创建一个ModelAndView对象,并设置视图为jsonView,然后返回该对象。

    另外,还可以通过自定义拦截器来实现返回JSONP数据,该拦截器可以在请求处理方法执行完毕后将结果转换为JSONP格式数据并返回。

    综上所述,Spring提供了多种方式来返回JSONP格式的数据,开发者可以根据具体的需求选择合适的方式来实现。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部