Неожиданный токен <ошибка для вызовов JS при загрузке файла index.html из папки ресурсов с помощью сервера NanoHTTPD - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь разработать автономное приложение для Android, в котором я бы показывал html-страницу в веб-просмотре с вызовами css и js, используя веб-сервер NanoHTTPD. HTML-файл index.html находится в папке assets, в то время как файлы js и css находятся в папке assets / lib. До сих пор мне удалось просмотреть только HTML-файл.

Это был мой файл NanoHTTPD

package jensklingenberg.de.jkandroidwebserver;

import android.content.Context;
import android.content.res.AssetManager;
import android.os.Environment;
import android.util.Log;
import fi.iki.elonen.NanoHTTPD;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Map;

import static android.content.ContentValues.TAG;


public class MyHTTPD extends NanoHTTPD {
public static final int PORT = 8765;
private Context mContext;

public MyHTTPD(Context context) throws IOException {
    super(PORT);
    this.mContext = context;
}

//@Override
public Response serve(IHTTPSession session) {
    Method method = session.getMethod();
    String uri = session.getUri();

    AssetManager assetManager = mContext.getAssets();
    InputStream is = null;
    String answer = "";

    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    String line = "";
    try
    {
        while ((line = reader.readLine()) != null) {
            answer += line;
        }
        reader.close();
    }
    catch (IOException e )
    {}
    return newFixedLengthResponse(Response.Status.OK, "text/html", answer);

}
}

Это мой index.html

<!DOCTYPE html>
<html>
    <head>
    <meta charset="utf-8" />
    <title>Test Page</title>       
</head>
<body>
    <h1 id="pageheader">Hello There</h1>
</body>

Но всякий раз, когда я пытаюсь загрузить внешние js-файлы, как показано ниже

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>Test Page</title>        
    <script type="text/javascript" src='lib/jquery_2.1.1.min.js'></script>
    </head>
    <body>
        <h1 id="pageheader">Hello There</h1>
    </body>
 </html>

Я получаю сообщение в LogCat, в котором говорится "Uncaught SyntaxError: неожиданный токен <" </p>

Загрузка через f: /// исключена!

При поиске ответа я нашел два связанных вопроса и очень расплывчатые ответы по следующим ссылкам SO

  1. Справочник по Android, NanoHttpd и Local jQuery

  2. Как обслуживать внешние файлы css, jpg и gif из Nanohttpd (Nanohttpd запускается на обычном компьютере, а не на Android)?

После просмотра ответов я даже попытался изменить свой файл NanoHTTPD на следующий, но безрезультатно

package jensklingenberg.de.jkandroidwebserver;

import android.content.Context;
import android.content.res.AssetManager;
import android.os.Environment;
import android.util.Log;
import fi.iki.elonen.NanoHTTPD;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Map;

import static android.content.ContentValues.TAG;


public class MyHTTPD extends NanoHTTPD {
public static final int PORT = 8765;
private Context mContext;

public MyHTTPD(Context context) throws IOException {
    super(PORT);
    this.mContext = context;
}

//@Override
public Response serve(IHTTPSession session) {
    Method method = session.getMethod();
    String uri = session.getUri();

    AssetManager assetManager = mContext.getAssets();
    InputStream is = null;
    String answer = "";
    try {            
        is = assetManager.open("index.html"); 
        switch (uri) {
           case "/":
                    return newChunkedResponse(Response.Status.OK, "text/html", is);
            case "lib/jquery_2.1.1.min.js":
                InputStream is2 = assetManager.open("lib/jquery_2.1.1.min.js");
                return newChunkedResponse(Response.Status.OK, "text/javascript", is2);
            }
    } catch (Exception e) {
        e.printStackTrace();
    }


}
}

Итак, как мне успешно загрузить файлы js и css из папки assets?

P.S. - Я заметил, что большинство решений, которые я нашел, обычно возвращают ответ как таковой

return new NanoHTTPD.Response(answer);

, который не работает для меня. Это показывает мне ошибку

error: constructor Response in class Response cannot be applied to given 
types;
required: IStatus,String,InputStream,long
found: String
reason: actual and formal argument lists differ in length

Вот почему я использую

 return newChunkedResponse(Response.Status.OK, "text/html", is);

Может ли это также повлиять на проблему?

...