【问题标题】:How do I add attributes to http request to spring controller?如何将属性添加到 Spring 控制器的 http 请求?
【发布时间】:2016-04-01 20:03:18
【问题描述】:

我想测试下面的弹簧控制器,它读取http request attributes 并作用于它们。我可以通过在我的网络浏览器中输入localhost:8080/someURL 来触发下面的控制器代码。但结果是{"id":1,"content":"null and null and null"},表示null 命名为request attributes 中的值。 如何向包含指定request attributes 的值的localhost:8080/someURL 等命名网址发送请求,以便确认接收控制器代码正常工作?

这是控制器的代码:

import java.util.concurrent.atomic.AtomicLong;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestPa    ram;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;

@Controller
public class SomeController {

    private final AtomicLong counter = new AtomicLong();

    @RequestMapping(value = "/someURL", method=RequestMethod.GET)
    public @ResponseBody Greeting receiveSMS(HttpServletRequest req){
        String att1 = (String) req.getAttribute("att1");
        String att2 = (String) req.getAttribute("att2");
        String att3 = (String) req.getAttribute("att3");
        String total = att1 + " and " + att2 + " and " + att3;
        return new Greeting(counter.incrementAndGet(), String.format(total));
    }

    }  

注意:我正在尝试在 Spring the PHP functionality that is given in the script at the following link 中重新创建。我没有在下面写过这种代码,如果我对问题的构想不佳,我将不胜感激重新构想的建议。以及指向任何示例解决方案的链接,例如 JUNIT 或用于重新创建请求的其他方法。

【问题讨论】:

  • 来自浏览器的请求永远不会包含任何属性。它可以拥有属性的唯一方法是,如果某些其他资源将这些属性放在请求中,然后转发(或包含)到此控制器。或者如果服务器上的某些过滤器或拦截器之前放置了它们。
  • 所以,要么之前有这样的资源,你应该测试那个资源或者写一个单元测试,或者有这样的资源,请求应该直接来自浏览器,并且那么代码就不正确了。
  • @JBNizet 这是一个将从第三方放入 Web 服务的 URL。我不会使用total 字符串回复,而是将三个request attributes 传递给算法。为了测试目的,将它们作为响应发送更容易。如果您说SYSO total 字符串更好,我可以这样做,但我仍然需要向包含命名attributes 的 url 发送请求。我该怎么做?
  • 你不能从外部传递属性。时期。任何客户端都无法将属性传递给您的控制器。您需要将它们设为参数、标头或路径变量,即可以使用 HTTP 发送的内容。
  • @JBNizet 感谢您指导这个答案。

标签: java spring http spring-mvc servlets


【解决方案1】:

请求属性是仅服务器端的构造。尝试改用请求参数

@RequestMapping(value = "/someURL", method = RequestMethod.GET)
public @ResponseBody Greeting receiveSMS(@RequestParam("att1") String att1, @RequestParam("att2") String att2, @RequestParam("att3") String att3){
    String total = String.format("%s and %s and %s", att1, att2, att3);
    return new Greeting(counter.incrementAndGet(), total);
}

然后发送表单的请求:

http://localhost:8080/someURL?att1=value1&att2=value2&att3=value3

您应该能够读取您尝试传递的值。

【讨论】:

  • 这是一个将从第三方放入 Web 服务的 URL。我不会使用total 字符串回复,而是将三个request attributes 传递给算法。为了测试目的,将它们作为响应发送更容易。如果你说SYSOtotal 字符串更好,我可以这样做,但我仍然需要向包含命名attributes 的 url 发送请求。我该怎么做?
  • @CodeMed 问题不在于输出。问题是属性是纯粹的服务器端 servlet API 事物。它们不是 HTTP 协议的一部分。没有办法从外部传递属性。阅读我的 cmets。
  • @CodeMed 正如 JB Nizet 所说。属性不是由客户端传入的。但是参数和标题是。因此,请弄清楚您究竟想从请求中读取什么,并使用适当的方法来读取信息。
  • @JBNizet 我在我的 OP 末尾添加了一条注释,显示了一个指向我试图在 Spring 中模仿的 PHP 脚本的链接。我不知道 PHP,但我的翻译是它包含三个请求参数。我的 OP 中的 spring 控制器代码将用于接收与我的 OP 中的链接中的 PHP 代码应该接收的相同消息。 这是否有助于澄清我要学习的内容?如果您觉得我的问题不够好,我很乐意重新提出我的问题。
  • 感谢您和 +1 抽出宝贵时间及时回答。
【解决方案2】:

测试类似:

http://localhost:8080/someURL?att1=value1&att2=value2&att3=value3

它会显示传入 URL 的 value1、value2 和 value3...

【讨论】:

  • 不,不会。您将属性与参数混淆了。
  • 哦!比恩!我没有感到困惑,但我有点累了...:p 感谢您的指点。
【解决方案3】:

结帐Spring MVC Test framework - 代替手动触发某些 URL,而是编写单元测试。

关于你的笔记

是的,那是参数。在 php 中,您有 $_GET 和 $_POST 或(如果您不关心方法)只需 $_REQUEST 即可访问请求参数。从 getAttribute() 重新编码为 getParameter() 或使用 @RequestParam 注释将它们放入您的方法签名中。

@RequestMapping(value = "/receiveSMS", method=RequestMethod.GET)
public @ResponseBody Greeting receiveSMS(@RequestParam("from") String from,
       @RequestParam("to") String to, @RequestParam("body") String body){

}

现在你可以试试http://localhost:8080/yourapp/receiveSMS?from=me&to=you&body=stackoverflow

旁注:

如果您希望从客户端发送该信息,您应该改用getParameter() 调用。

【讨论】:

  • 我在我的 OP 末尾添加了一条注释,根据 cmets 澄清了我的问题。这是否有助于您确定解决方案?我以前没有编写过 JUNIT 测试,但是如果您可以建议特定的代码来完成我的 OP 末尾的 NOTE 中的链接所完成的任务,我可以轻松地将 JUNIT 添加到我的 gradle.build 中。
  • 做到了。感谢您和 +1 抽出宝贵时间及时回复。
  • 以上适用于 GET,但它必须适用于 POST。如果我在下面的代码中将 GET 更改为 POST,如何测试发布请求?当我使用浏览器中的 url 时,日志显示错误,表明请求了不支持的 GET。
猜你喜欢
  • 2018-10-11
  • 2013-02-08
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多