1

与 Jersey 或其他框架中的 Restful 语法类似,我可以像这样在 Restful uri 路径中获取变量:

@Path("/users/{username}")
public class UserResource {

    @GET
    @Produces("text/xml")
    public String getUser(@PathParam("username") String userName) {
        ...
    }
}

但是在 californium 中,语法不同,我尝试了这些代码,但它不正确:

class usersextends CoapResource {

    public users() {
        super("users/{username}");
    }

    @Override
    public void handleGET(CoapExchange exchange) {

        exchange.respond("The username is "+ ???????);
    }
}

我如何使用与第一段代码相同的功能?另一件事是我在哪里可以找到官方文档介绍API?我刚刚看到源代码并尝试现在找到解决方案。

4

1 回答 1

1

创建您自己的 MessageDeliverer 并更改 findResource 方法:

public class MyMessageDeliverer implements MessageDeliverer {

  private final Resource root;

  public MyMessageDeliverer(Resource root) {
    this.root = root;
  }

  /* You can use  implementation of methods from ServerMessageDeliverer */
  @Override
  public void deliverRequest(Exchange exchange) {
  }

  @Override
  public void deliverResponse(Exchange exchange, Response response) {
  }

  /* method returns last known Resource instead of null*/
  private Resource findResource(List<String> list) {
    LinkedList<String> path = new LinkedList<String>(list);
    Resource current = root;
    Resource last = null;
    while (!path.isEmpty() && current != null) {
      last = current;
      String name = path.removeFirst();
      current = current.getChild(name);
    }
    if (current == null) {
      return last;
    }
    return current;
  }
}

使用您的 MessageDeliverer:

server = new CoapServer();
server.setMessageDeliverer(new MyMessageDeliverer(server.getRoot()));

将您的资源添加到服务器:

server.add(new Users());

请求 /users/{username} 将被传递到您的用户资源。从请求 URI 中获取变量:

public class Users extends CoapResource {

  public Users() {
    super("users");
  }

  public void handleGet(CoapExchange exchange) {
    List<String> uri = exchange.getRequestOptions().getUriPath();
    uri.remove("users");
    String username = uri.remove(0);

    //for query params:
    Map<String, String> params = new HashMap<String, String>();
    for (String p : exchange.getRequestOptions().getUriQuery()) {
      String[] parts = p.split("=");
      params.put(parts[0], parts[1]);
    }
    String param = params.get("param");

  }

}
于 2016-06-02T07:59:20.830 回答