Java 如何向spring控制器的http请求添加属性?
我想测试下面的spring控制器,它读取Java 如何向spring控制器的http请求添加属性?,java,spring,http,spring-mvc,servlets,Java,Spring,Http,Spring Mvc,Servlets,我想测试下面的spring控制器,它读取http请求属性,并对其进行操作。我可以通过在我的web浏览器中键入localhost:8080/someURL来触发下面的控制器代码。但是结果是{“id”:1,“content”:“null and null and null”},这表示指定的请求属性中的null值如何向包含指定的请求属性值的指定url(如localhost:8080/someURL)发送请求,以便确认接收控制器代码正常工作? 以下是控制器的代码: import java.util.co
http请求属性
,并对其进行操作。我可以通过在我的web浏览器中键入localhost:8080/someURL
来触发下面的控制器代码。但是结果是{“id”:1,“content”:“null and null and null”}
,这表示指定的请求属性中的null
值如何向包含指定的请求属性值的指定url(如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));
}
}
注:我试图在春天重新创作。我没有在下面写过这样的代码,如果我对这个问题的理解不好,我将非常感谢你的建议。以及指向任何示例解决方案(如JUNIT)的链接或用于重新创建请求的其他方法。请求属性仅为服务器端构造。尝试改用请求参数:
@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
您应该能够读取您试图通过的值。测试如下内容:
它将向您显示传递到URL中的value1、value2和value3…签出-而不是手动触发某些URL,而是编写单元测试
关于你的笔记
是的,这就是参数。在php中,您有$\u GET和$\u POST,或者(如果您不关心方法的话)只需$\u请求即可访问请求参数。将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){
}
现在你可以试试了
旁注:
如果希望从客户端发送该信息,则应使用getParameter()
调用。如果请求来自浏览器,则该请求永远不会包含任何属性。它拥有属性的唯一方式是,如果其他资源将这些属性放入请求中,然后转发(或包含)到此控制器。或者如果服务器上的某个筛选器或拦截器将它们放在前面。因此,要么之前有这样的资源,您应该测试该资源或编写单元测试,要么有这样的资源,请求应该直接来自浏览器,代码不正确。@JBNizet这是一个将从第三方放入web服务的url。我将把三个请求属性
传递到一个算法中,而不是用total
字符串进行响应。出于测试目的,将它们作为响应发送比较容易。如果您说最好使用SYSO
字符串total
,我可以这样做,但我仍然需要向包含命名的属性的url发送请求。我该怎么做?不能从外部传递属性。时期任何客户端都无法将属性传递给控制器。您需要将它们设置为参数、标题或路径变量,即可以使用HTTP发送的内容。@jbnize感谢您将其引导至答案。不,不会。你把属性和参数搞混了。哦!边武!我并不困惑,但我有点累了…:p谢谢你的指针。这是一个将从第三方放入web服务的url。我将把三个请求属性
传递到一个算法中,而不是用total
字符串进行响应。出于测试目的,将它们作为响应发送比较容易。如果您说最好使用SYSO
字符串total
,我可以这样做,但我仍然需要向包含命名的属性的url发送请求。“我该怎么做?”CodeMed问题不在于输出。问题在于属性纯粹是服务器端ServletAPI。它们不是HTTP协议的一部分。无法从外部传递属性。阅读我的评论。@代码完全按照JB Nizet所说。客户端不会传入属性。但是参数和头是不正确的。因此,请找出您正试图从请求中读取的内容,并使用适当的方法读取信息。@JBNizet我在我的OP末尾添加了一个注释,其中显示了指向我试图在Spring中模拟的PHP脚本的链接。我不知道PHP,但我对它的翻译是它包含三个请求参数。我的OP中的spring控制器代码将用于接收我OP中链接中的PHP代码应该接收的相同消息。这是否有助于澄清我试图学习的内容?如果您觉得我的问题问得不够好,我很乐意重新组织我的问题。感谢您和+1花时间及时回答。我在我的作业末尾添加了一条注释,根据评论澄清了我的问题。这是否有助于您确定解决方案?我以前没有写过JUNIT测试,但是如果你能建议具体的代码来完成我的操作结束时的注释中的链接所完成的任务,我可以很容易地将JUNIT添加到我的gradle.build中。感谢您和+1花时间及时回复。以上内容适用于GET,但必须适用于POST。如果我在下面的代码中更改了GET to POST,我如何测试POST请求?当我使用浏览器中的url时,日志显示一个错误,指示请求了不受支持的GET。