扩展 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 具有作为字符串的方法。它已经改变了。
未更新功能列表以反映此更改。
我一直在尝试使用 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 具有作为字符串的方法。它已经改变了。
未更新功能列表以反映此更改。