扩展 Nanohttp 实现以处理自定义 HTTP 方法

Extending Nanohttp implementation to handle custom HTTP methods

我一直在尝试使用 this cordova plugin,它使用 NanoHttpd 来处理请求。
默认情况下,Nanohttpd 处理 some of the HTTP methods,如 GET、POST、CONNECT、PROPFIND、PATCH 等

我一直在尝试弄清楚如何实现自定义处理程序,以便 nanohttpd 可以处理更多 HTTP 方法,例如:NOTIFY 和 SUBSCRIBE

@Override
    public Response serve(IHTTPSession session) {
        Log.d(this.getClass().getName(), "New request is incoming!");

        String requestUUID = UUID.randomUUID().toString();

        PluginResult pluginResult = null;
        try {
            pluginResult = new PluginResult(
                    PluginResult.Status.OK, this.createJSONRequest(requestUUID, session));
        } catch (JSONException e) {
            e.printStackTrace();
        }
        pluginResult.setKeepCallback(true);
        this.webserver.onRequestCallbackContext.sendPluginResult(pluginResult);

        while (!this.webserver.responses.containsKey(requestUUID)) {
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        JSONObject responseObject = (JSONObject) this.webserver.responses.get(requestUUID);
        Log.d(this.getClass().getName(), "responseObject: " + responseObject.toString());
        Response response = null;

        try {
            response = newFixedLengthResponse(
                    Response.Status.lookup(responseObject.getInt("status")),
                    getContentType(responseObject),
                    responseObject.getString("body")
            );

            Iterator<?> keys = responseObject.getJSONObject("headers").keys();
            while (keys.hasNext()) {
                String key = (String) keys.next();
                response.addHeader(
                        key,
                        responseObject.getJSONObject("headers").getString(key)
                );
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
        return response;
}

我添加了一个简单的 notify 响应来处理任何传入的请求,从这里引用 -

public Response notify(IHTTPSession session) {
        StringBuilder text = new StringBuilder("<html><body>");
        text.append("<h1>Url: ");
        text.append(session.getUri());
        text.append("</h1><br>");
        Map<String, String> queryParams = session.getParms();
        if (queryParams.size() > 0) {
            for (Map.Entry<String, String> entry : queryParams.entrySet()) {
                String key = entry.getKey();
                String value = entry.getValue();
                text.append("<p>Param '");
                text.append(key);
                text.append("' = ");
                text.append(value);
                text.append("</p>");
            }
        } else {
            text.append("<p>no params in url</p><br>");
        }
        return newFixedLengthResponse(text.toString());
    }

但是这个returnsBAD REQUEST: Syntax error. HTTP verb NOTIFY unhandled.

文档不明确,并且没有太多关于在 SO 上或通过网络结果扩展 Nanohttpd 行为的信息。

正确的做法是什么?我该如何扩展它?

Method 的检查实际上锁定在一个枚举中。就是hardcoded,没有其他方法展开。

getMethod实例本身是一个枚举类型的方法。

由于我找不到任何其他解决方案,因此我得出结论,不可能在 Nanohttpd 中执行此操作。它在 Maven 中的所有版本都不支持这个。

他们有的原因

Some built-in support for HEAD, POST and DELETE requests. You can easily implement/customize any HTTP method, though.

在他们的功能列表中提到的是因为 original version 具有作为字符串的方法。它已经改变了。

未更新功能列表以反映此更改。