在Jersey 2中,我试图开发一种方法,它允许传递一对JSON列表(服务、方法),这些列表表示REST请求中对资源的访问路径,并将结果聚合到单个响应中。因此,JSON列表可以如下所示:
[
{
service : "customerService",
method : "getCustomer",
params : {
id:57
}
},
{
service : "customerService",
method : "getContacts",
params : {
idContact : 75
}
}
]
相应的命令bean可以如下所示:
public class Command {
private String method;
private String service;
public Command() {
}
public Command(final String service, final String method) {
this.service = service;
this.method = method;
}
public String getMethod() {
return method;
}
public String getService() {
return service;
}
public void setMethod(final String method) {
this.method = method;
}
public void setService(final String service) {
this.service = service;
}
}
@Path("/customerService")
public class CustomerService {
@GET
@Path("/getCustomer/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Customer getCustomer(@PathParam("id") final int id) {
...
}
@GET
@Path("/getContacts/{idCustomer}")
@Produces(MediaType.APPLICATION_JSON)
public List<Contact> getContacts(@PathParam("idCustomer") final int idCustomer) {
...
}
}
@Context
ExtendedResourceContext context;
@POST
@Path("/exec")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.TEXT_PLAIN)
public String exec(List<Command> commands) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
final List<Resource> resources = context.getResourceModel().getRootResources();
for (final Command command : commands) {
for (final Resource serviceResource : resources) {
if (serviceResource.getPath().equals("/" + command.getService())) {
System.out.println("Service found " + serviceResource.getPath());
for (final Resource methodResource : serviceResource.getChildResources()) {
if (methodResource.getPath().equals("/" + command.getMethod())) {
for (ResourceModelComponent component : methodResource.getComponents()) {
if (component instanceof ResourceMethod) {
final ResourceMethod m = (ResourceMethod) component;
if (m.getHttpMethod().equals("GET") || m.getHttpMethod().equals("POST")) {
final Invocable invocable = m.getInvocable();
Method method = invocable.getHandlingMethod();
method.invoke(this);
}
}
}
}
}
}
}
}
return "ok";
}
我找到了这个主题,但它似乎适用于Jersey的版本1:如何在单个请求中访问多个资源:Jersey Rest
谢谢你的回答,为我糟糕的英语感到抱歉。
JSONObject jo=new JSONObject();
JSONObject jo1=new JSONObject();
JSONArray jarr=new JSONArray();
jo.put("service","customerService");
jo.put("method","getCustomer");
jo1.put("id","57");
jo.put("params",jo1);
jarr.put(jo);
通过使用上面的例子,你可以解决你的问题。希望这对你有帮助
但是,只有第一个值才会被设置(也就是说,如果是第一个,那么只有它才会被设置。如果是第一个,那么只有它才会被设置)。当我访问第二个和第三个值时,它们的值为而不是传递给它的值。下面是表单提交时传递的表单数据示例: 提交表单时传递所有信息,但实际上只有第一个标记在设置数据。我收到的请求是不是错了?有什么我需要注册的东西我没有在做吗
我有一个资源: 我想定义一个补丁,这样客户端就可以更新image、bio或两者。 有效的请求主体示例如下: 如果属性单独发送,则现有的属性将在服务器上保持不变,并且只会更新图像。如果两者都发送(如上所述),两者都将更改。 简而言之: > 不允许使用空的请求正文。 ,or是允许的。 这就是我目前所拥有的。我正在使用带有两个独立类型的anyOf对象:object。我曾使用virtserver在Swag
问题内容: eclipselink(或Hibernate)中的租户是一个很好的概念,可以将数据域彼此分开。我在单表策略中使用eclipselink。 有时有必要从多个租户那里访问数据(例如,出于管理目的)。有什么好办法吗?(我不想遍历所有租户来收集数据…) 例: 我可以使用参数化的实体管理器访问特定租户中的对象: 有没有方便的方法可以查询所有租户?(或者持久性对象的身份仅在单个租户中定义?) 问题
我从一个根有两个节点,我想在一个请求中删除这两个节点的数据。两个子节点具有相同的密钥。我试过这个: 但是它只从第一个节点删除数据
问题内容: 如何在一个HTTP请求中下载多个文件?我的意思是,当您有多个附件时,选择要下载的内容,然后按下载,这样便可以自动下载它们,而不必手动单击每个附件。 我正在使用PHP作为服务器端加密。 问题答案: 它 是 可以发送一个在HTTP响应多: 通常,HTTP与任何其他媒体类型一样对待多部分消息主体:严格作为有效负载。[…] HTTP用户代理应遵循与MIME用户代理在收到多部分类型时相同或相似的
我正在编写一个时髦的脚本,以在一个步骤中测试我的所有服务。 我导入了WSDL,然后自动生成所有SOAP请求。 我希望减少逐个测试所有SOAP服务的手动工作。 所以,如果可能的话,我想通过groovy实现。 从addressScript中的这里——我想在以后的所有测试用例中访问所有的SOAP请求。那么有没有可能通过上下文中的一些循环来实现它呢..?下面是我正在尝试的示例代码。 我的主要座右铭是减少逐