Получение текстового файла из node.js сервер в моем java-приложении Android studio

#javascript #java #android #node.js

#javascript #java #Android #node.js

Вопрос:

Я создаю приложение на Android studio с использованием Java, и я хочу создать веб-сайт, на котором вы можете редактировать текстовые файлы. Я хочу, чтобы приложение Android подключалось к веб-серверу и извлекало эти файлы. Я просто не понимаю, как соединить это вместе. например, как мне получить текстовый файл из моего node.js сервер для моего приложения для Android. моей первоначальной мыслью было бы отправить HTTP-запрос на сервер, но я понятия не имею, как даже начать его кодировать. Любая помощь была бы очень признательна Заранее спасибо

JAVA

 public class MainActivity extends AppCompatActivity {

private static final String SERVER = "http://10.0.2.2:3000/";

private TextView tvServerResponse;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    tvServerResponse = findViewById(R.id.textView);
    Button contactServerButton = findViewById(R.id.button);
    contactServerButton.setOnClickListener(onButtonClickListener);
}

View.OnClickListener onButtonClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        HttpGetRequest request = new HttpGetRequest();
        request.execute();
    }
};

public class HttpGetRequest extends AsyncTask<Void, Void, String> {

    static final String REQUEST_METHOD = "GET";
    static final int READ_TIMEOUT = 15000;
    static final int CONNECTION_TIMEOUT = 15000;

    @Override
    protected String doInBackground(Void... params){
        String resu<
        String inputLine;

        try {
            // connect to the server
            URL myUrl = new URL(SERVER);
            HttpURLConnection connection =(HttpURLConnection) myUrl.openConnection();
            connection.setRequestMethod(REQUEST_METHOD);
            connection.setReadTimeout(READ_TIMEOUT);
            connection.setConnectTimeout(CONNECTION_TIMEOUT);
            connection.connect();

            // get the string from the input stream
            InputStreamReader streamReader = new InputStreamReader(connection.getInputStream());
            BufferedReader reader = new BufferedReader(streamReader);
            StringBuilder stringBuilder = new StringBuilder();
            while((inputLine = reader.readLine()) != null){
                stringBuilder.append(inputLine);
            }
            reader.close();
            streamReader.close();
            result = stringBuilder.toString();

        } catch(IOException e) {
            e.printStackTrace();
            result = "error";
        }

        return resu<
    }

    protected void onPostExecute(String result){
        super.onPostExecute(result);
        tvServerResponse.setText(result);
    }
}
 

}

JS:

 const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});`
 

У меня есть этот код, но он выдает catch в java-коде из строки connection.connect()

я предполагаю, что он не может подключиться к серверу, но я не понимаю, почему

Ответ №1:

Вы можете использовать очень популярную HTTP-библиотеку под названием OkHttp ( https://github.com/square/okhttp )

Я написал этот фрагмент кода, чтобы вы могли адаптировать его в своем приложении:

Java:

   public void downloadTxt(String url) {
    Request request = new Request.Builder()
        .url(url)
        .build();
    OkHttpClient client = new OkHttpClient();
    client
        .newCall(request)
        .enqueue(new Callback() {
          @Override
          public void onFailure(@NotNull Call call, @NotNull IOException e) {
              //error reaching your site
              e.printStackTrace();
          }

          @Override
          public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
            if(response.isSuccessful()) {
              System.out.println(response.body().string());
            } else {
              System.out.println("Error with code: " response.code());
            }
          }
        });
  }
 

Kotlin:

     fun downloadTxt(url: String) {
        val request: Request = Request.Builder()
            .url(url)
            .build()
        val client = OkHttpClient()
        client
            .newCall(request)
            .enqueue(object : Callback() {
                fun onFailure(call: Call, e: IOException) {
                    e.printStackTrace()
                }

                fun onResponse(call: Call, response: Response) {
                    if (response.isSuccessful()) {
                        println(response.body().string())
                    } else {
                        println("Error with code: ${response.code()}")
                    }
                }
            })
    }
 

Комментарии:

1. Я пытаюсь просто подключить приложение к серверу в данный момент, а затем настроить ответ с сервера, на данный момент я только что получил его, возвращая Hello World. я отредактировал свой вопрос, чтобы включить код, который я пытаюсь использовать

2. я пытался реализовать это, но, похоже, он все еще не может подключиться, он даже не может подключиться к https://reqres.in/api/users?page=2// . Есть ли что-нибудь еще, кроме добавления в манифест Android: <uses-permission android:name="android.permission.INTERNET"/> ?

3. Почему вы добавляете двойную косую черту в конце URL-адреса? Это reqres.in/api/users?page=2 и это работает. Может быть, на устройстве возникли проблемы с подключением?

4. вот о чем я думаю, это не работает без них // , я не слишком уверен, как устранить проблему с подключением на устройстве

5. пожалуйста, поделитесь сутью со всем классом, чтобы мы могли ее увидеть