最新的 Nanohttpd jar 出错

Error with latest jar of Nanohttpd

我按照 SO 将 NanoHttpd 设置为从此处提供文件 -

这有效,但我需要使用 Github 的最新版本,因为它处理更多 HTTP 方法并且是项目所必需的。

我在本地构建了jar并添加并编译了APK。 Web 服务器初始化,但每个请求都返回为 Not Found。没有其他的。也没有日志可以查看问题。怎么回事?

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.util.Map;

import android.util.Log;

import org.nanohttpd.protocols.http.NanoHTTPD;
import org.nanohttpd.protocols.http.response.Response;
import org.nanohttpd.protocols.http.response.Status;
import org.nanohttpd.protocols.http.request.Method;

import static org.nanohttpd.protocols.http.response.Response.newChunkedResponse;

public class MainActivity extends AppCompatActivity {

    public WhosebugMp3Server server;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        server = new WhosebugMp3Server();
        try {
            server.start();
        } catch(IOException ioe) {
            Log.w("Httpd", "The server could not start.");
        }
        Log.w("Httpd", "Web server initialized.");
    }

    @Override
    public void onDestroy()
    {
        super.onDestroy();
        if (server != null)
            server.stop();
    }

    public class WhosebugMp3Server extends NanoHTTPD {

        public WhosebugMp3Server() {
            super(8089);
        }

        public Response serve(String uri, Method method,
                              Map<String, String> header, Map<String, String> parameters,
                              Map<String, String> files) {
            String answer = "";
            Log.w("HTTPD", uri);
            Log.w("HTTPD", parameters.toString());

            Log.w("HTTPD", "Method is: "+method.toString());
            Log.w("HTTPD", "Header is: "+header.toString());

            FileInputStream fis = null;
            try {
                fis = new FileInputStream("/storage/C67A-18F7/"
                        + "/Music/"+uri);
                Log.w("HTTPD", uri + " found");
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return newChunkedResponse(Status.OK, "audio/mpeg", fis);
        }
    }
}

同样的代码适用于 2.2 到 2.3
但不是最新的,2.3.2

我在 adb 中收到服务器启动提示 logcat
03-26 18:18:26.005 15056 15056 W Httpd : Web server initialized.
但所有其他请求 returns Not Found

>$ curl -X GET http://192.168.1.2:8089  
Not Found
>$ curl -X GET http://192.168.1.2:8089/demo.mp3  
Not Found

我找不到代码有什么问题?

您的 serve() 没有覆盖 NanoHTTPD 正在调用的任何方法。默认实现 returns "404 Not Found".

serve() 的签名是

protected Response serve(IHTTPSession session)

但是它已被弃用。查看 this commit 中介绍的 IHandlers。 (默认处理程序仍然会调用已弃用的 serve() 方法。)