如何在url中为rest服务的get方法传递逗号分隔的参数
Posted
技术标签:
【中文标题】如何在url中为rest服务的get方法传递逗号分隔的参数【英文标题】:How to pass comma separated parameters in a url for the get method of rest service 【发布时间】:2012-04-25 10:31:19 【问题描述】:我有一个类似的网络服务
@GET
@Produces("application/json")
@Path("parameter1/july/param2,param3,param4/month")
public Month getResult(@PathParam("parameter1") String parameter1, @PathParam("param2") PathSegment param2 , @PathParam("param3") PathSegment param3, @PathParam("param4") PathSegment param4)
return action.getResult(parameter1, new Integer(param2.getPath()), new Integer(param3.getPath()), new Integer(param3.getPath()));
如果我从我的测试类中调用这个 Web 服务,它可以正常工作;但是如果我通过浏览器调用它,我会收到找不到服务的消息。
我通过浏览器使用的网址是
http://localhost:8080/WebApp/services/seating/mylogin/july/1,0,0/month
如果我使用 url 作为
http://localhost:8080/WebApp/services/seating/mylogin/fly/1/0/0/month
并相应地更改服务中的路径它可以正常工作,但要求是使用逗号而不是斜杠。有什么方法可以在 url 中使用带有逗号分隔参数的 web 服务?
【问题讨论】:
+1 写得很好的问题。这些天在 SO 上很难找到他们。 为什么您使用 URL 路径将参数传递给您的服务,而不是作为标准 GET 参数发送?例如,我会将服务部署到/WebApp/services/seating
,然后让客户端调用像/WebApp/services/seating?param1=mylogin&param2=fly&param3=1&param4=0...
这样的URL。
我无法使用?然后是参数,所有的 url 都在 js 文件中,并根据 UI 的请求动态调用,在 w3 建议中,我看到浏览器在遇到逗号时删除参数并在逗号之前查找资源,我猜这是导致问题的原因,我的测试类调用服务没有任何问题并返回结果
@RaviMishra 那么哪个答案对您有帮助?您可以通过投票将其标记为“此答案很有用”吗?
【参考方案1】:
对我来说,用逗号分隔多个参数没有问题,即使这些参数是路径的一部分而不是查询参数。 我测试了它,它确实有效。
实际上,如果您不需要检查这些参数的正确性,您甚至可以直接绑定到int
。我确实使用@PathVariable
进行这些绑定。
@GET
@Produces("application/json")
@Path("parameter1/july/param2,param3,param4/month")
public Month getResult(@PathVariable("parameter1") String parameter1, @PathVariable("param2") int param2 , @PathVariable("param3") int param3, @PathVariable("param4") int param4)
return action.getResult(parameter1, param2, param3,param3);
编辑:
至于我测试的代码是这样的:
@Controller
public class InfoController
@RequestMapping(method = RequestMethod.GET, value = "/seating/param1,param2,param3/month")
public String showMonthView(Model uiModel, @PathVariable("param1") int p1,
@PathVariable("param2") int p2, @PathVariable("param3") int p3,
HttpServletRequest httpServletRequest)
LOG.debug(String.format("view:/seating/%d,%d,%d/month", p1, p2, p3));
uiModel.addAttribute("param1", p1);
uiModel.addAttribute("param2", p2);
uiModel.addAttribute("param3", p3);
return "month";
@ResponseBody
@RequestMapping(method = RequestMethod.GET, value = "/seating/param1,param2,param3/month", produces="application/json")
public Map<String, Integer> showMonthJson(@PathVariable("param1") final int p1,
@PathVariable("param2") final int p2, @PathVariable("param3") final int p3)
LOG.debug(String.format("json:/seating/%d,%d,%d/month", p1, p2, p3));
Map<String, Integer> result = new HashMap<String, Integer>()
put("param1", p1);
put("param2", p2);
put("param3", p3);
;
return result;
第一种方法的正确视图位于 /seating/month.jsp。
或者,返回由 3 个参数组成的实体并生成 json 或 xml 也没有问题。
【讨论】:
我使用@PathVariable 做了同样的事情,但对我没有用,我的运气不好,您是否使用过localhost:8080/WebApp/services/seating/mylogin/july/1,0,0/month 这样的网址并尝试使用浏览器访问服务? 是的,我修改了我在本地使用的应用程序,并尝试了两个 url:localhost/webapp/seating/1,2,3
和 localhost/webapp/seating/1,2,3/month
。你想让我更新答案以包含我的测试代码吗?
请这样做,这将非常有帮助
非常感谢 Alex,我找到了问题并修复了它,实际上是应用程序 UI 中的 url 编码问题,url 没有正确编码与逗号对应的 ascii 值。跨度>
【参考方案2】:
在您的示例中,您使用的是PathSegment
,它代表整个路径段,在您的情况下为“1,0,0”,因此不能解析为整数。
如果您使用int
而不是PathSegment
,则会按照您的预期提取值,并且方法主体会更加简洁。
以下代码对我来说很好用:
@GET
@Path("parameter1/july/param2,param3,param4/month")
public String commaSeparatedValueDemo(@PathParam("parameter1") String parameter1, @PathParam("param2") int param2, @PathParam("param3") int param3, @PathParam("param4") int param4)
return MessageFormat.format("0: 1, 2, 3", parameter1, param2, param3, param4);
回应
.../some-resource/parameter1/july/1,2,3/month
是
参数1:1、2、3
【讨论】:
【参考方案3】:URL 参数不是逗号分隔的,它们是 '&' 分隔的。所以你要做的是'&' - 将它们分开。
【讨论】:
没错,只是他还没有查询字符串。 OP 将参数作为 URL 路径本身的一部分传递。 感谢您的回复,但是我不能在这里使用&,我什至没有应用程序的前端/UI,我只有可以用来访问服务的url和浏览器 @RaviMishra 这对我来说没有任何意义。您的问题涉及“URL 中的逗号分隔参数”。如果这不是它的真正含义,我建议您相应地编辑您的问题。 @EJP 实际上它不仅仅是关于 url,它关于使用具有逗号分隔参数的 url 来调用 web 服务。该url属于一个rest webservice @RaviMishra 所以下定决心。如果它们是 URL 的参数,它们应该用 & 分隔,没有两种方法。如果它们是单个参数的一部分,则逗号需要使用java.net.URLEncoder
进行URL 编码。你不能把任何你喜欢的东西放到一个 URL 中,这是有规则的。以上是关于如何在url中为rest服务的get方法传递逗号分隔的参数的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Rest Assured 在 GET url 中传递查询字符串参数?
如何在 GET 方法中为 Spring Boot 控制器类传递多个路径变量?
Next js - 如何在 url 中为 api 传递多个参数?