@ResponseBody和HttpServletResponce之间有什么区别

时间:2015-12-11 09:14:27

标签: java spring-mvc servlets

当我尝试使用Micro Message Public Platform时,weChat服务器将调用我的一个API,我需要返回一个令牌来验证我的身份。但是,当我像这样直接返回令牌时,weChat服务器会警告验证是错误的。

@RequestMapping(value="/userFollow", method= RequestMethod.GET)
@ResponseBody
public String weChatToken(HttpServletRequest request,String signature,String timestamp,String nonce,String echostr,HttpServletResponse response) throws IOException, DocumentException {
    String result=weChatService.checkSignature(signature,timestamp,nonce,echostr);
    return result;
}

然后我改变了我的代码如下。这一次,验证是正确的。

@RequestMapping(value="/userFollow", method= RequestMethod.GET)
    @ResponseBody
    public String weChatToken(HttpServletRequest request,String signature,String timestamp,String nonce,String echostr,HttpServletResponse response) throws IOException, DocumentException {
        String result=weChatService.checkSignature(signature,timestamp,nonce,echostr);
        PrintWriter pw=response.getWriter();
        pw.write(result);
        pw.flush();
        return null;
    }

我用谷歌搜索并在使用@Responsebody时得到它,Spring将消息写入响应主体。 那么它们之间的区别是什么?为什么第一种方式错了?

2 个答案:

答案 0 :(得分:1)

HTTP响应由状态代码,一些标头和正文组成。使用@ResponseBody意味着您的方法提供正文的内容,而不是其他内容。使用HttpServletResponse可以使您的方法设置响应的所有方面,但使用起来有点不方便。

答案 1 :(得分:0)

您应该使用ResponseBody返回一些数据结构。因为你需要"只有"字符串,您应该将方法的返回类型从String更改为void并删除ResponseBody注释。

@RequestMapping(value="/userFollow", method= RequestMethod.GET)
public void weChatToken(HttpServletRequest request,String signature,String timestamp,String nonce,String echostr,HttpServletResponse response) throws IOException, DocumentException {
    String result=weChatService.checkSignature(signature,timestamp,nonce,echostr);
    PrintWriter pw=response.getWriter();
    pw.write(result);
    pw.flush();
}