簡體   English   中英

通過 api 將我的 Android 應用程序連接到我本地主機上的服務器

[英]Connect my Android app trough an api to my server on my localhost

我有個問題。 我想將我的 android 應用程序連接到在我的本地主機上運行的 PHP API。 但在這段代碼中,它總是拋出“Catch 1”,我什至試圖打印異常,但它沒有用。 這是我的 MainActivity 的代碼:

    package com.example.dbtest;

    import androidx.appcompat.app.AppCompatActivity;

    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;

    import org.json.JSONObject;

    import java.io.BufferedInputStream;
    import java.io.BufferedReader;
    import java.io.Console;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;

    public class MainActivity extends AppCompatActivity {
    private EditText etUsername;
    private EditText etPassword;

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

        etUsername = findViewById(R.id.editTextUsername);
        etPassword = findViewById(R.id.editTextPassword);
    }

    public void register(View view) {
        Log.d("MainActivity", "Button clicked");
        String username = etUsername.getText().toString();
        String password = etPassword.getText().toString();
        String url = "http://app.test/test.php?username="+ username +"&password="+ password;
        new MyAsyncTaskgetNews().execute(url);
    }

    public class MyAsyncTaskgetNews extends AsyncTask<String, String, String> {
        @Override
        protected void onPreExecute() {
            //before works
        }

        @Override
        protected String  doInBackground(String... params) {
            Log.d("MainActivity","In Background");
            // TODO Auto-generated method stub
            try {
                String NewsData;
                //define the url we have to connect with
                URL url = new URL(params[0]);
                //make connect with url and send request
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                //waiting for 7000ms for response
                urlConnection.setConnectTimeout(7000);//set timeout to 5 seconds

                try {
                    //getting the response data
                    InputStream in = new BufferedInputStream(urlConnection.getInputStream());
                    //convert the stream to string
                    NewsData = ConvertInputToStringNoChange(in);
                    //send to display data
                    publishProgress(NewsData);
                } finally {
                    //end connection
                    urlConnection.disconnect();
                }

            }catch (Exception ex)
            {
                Log.d("MainActivity", "Catch 1");
            }

            return null;
        }

        protected void onProgressUpdate(String... progress) {
            try {
                Log.d("MainActivity","In Progress");
                JSONObject json = new JSONObject(progress[0]);
                //display response data
                Toast.makeText(getApplicationContext(),json.getString("msg"),Toast.LENGTH_LONG).show();

            } catch (Exception ex) {
                Log.d("MainActivity","Catch 2");
            }
        }

        protected void onPostExecute(String  result2){
        }
    }

    // this method convert any stream to string
    public static String ConvertInputToStringNoChange(InputStream inputStream) {
        BufferedReader bureader=new BufferedReader( new InputStreamReader(inputStream));
        String line ;
        String linereultcal="";

        try{
            while((line=bureader.readLine())!=null) {

                linereultcal += line;

            }
            inputStream.close();


        }catch (Exception ex){}

        return linereultcal;
    }
}

我的 PHP API 非常簡單,所以不要 go 對我太苛刻。 但我多次檢查 API 工作我可以成功地將數據添加到我的數據庫中:我認為問題出在我的 android 代碼中。 這是我的 PHP API 的代碼:

<?php

$host = "localhost";
$user = "root";
$DBpassword = "Fenja2808";
$database = "demo";
$connect = mysqli_connect($host,$user,$DBpassword,$database);

if(mysqli_connect_errno()) 
{
    die("Error in connection: " . mysqli_connect_errno());
    return;
}

// get the data from html request
$username = $_GET['username'];
$password = $_GET['password'];

// define the query
$query = "INSERT INTO user(username,password) values('$username','$password');";

$result = mysqli_query($connect, $query);

if(!$result) 
{
    $output = "{'msg':'Inserting failed'}";
}
else 
{
    $output = "{'msg':'Insterting succsessfull'}";
}

print($output);

mysqli_close($connect);
?>

這是我要求的 Stacktrace!

2020-06-19 11:03:21.467 3017-3663/com.example.dbtest W/System.err: java.net.ConnectException: Connection refused
2020-06-19 11:03:21.518 3017-3663/com.example.dbtest W/System.err:     at java.net.PlainSocketImpl.socketConnect(Native Method)
2020-06-19 11:03:21.518 3017-3663/com.example.dbtest W/System.err:     at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:334)
2020-06-19 11:03:21.518 3017-3663/com.example.dbtest W/System.err:     at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:196)
2020-06-19 11:03:21.518 3017-3663/com.example.dbtest W/System.err:     at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178)
2020-06-19 11:03:21.518 3017-3663/com.example.dbtest W/System.err:     at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356)
2020-06-19 11:03:21.518 3017-3663/com.example.dbtest W/System.err:     at java.net.Socket.connect(Socket.java:605)
2020-06-19 11:03:21.518 3017-3663/com.example.dbtest W/System.err:     at com.android.okhttp.internal.Platform.connectSocket(Platform.java:113)
2020-06-19 11:03:21.518 3017-3663/com.example.dbtest W/System.err:     at com.android.okhttp.Connection.connectSocket(Connection.java:196)
2020-06-19 11:03:21.518 3017-3663/com.example.dbtest W/System.err:     at com.android.okhttp.Connection.connect(Connection.java:172)
2020-06-19 11:03:21.518 3017-3663/com.example.dbtest W/System.err:     at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:367)
2020-06-19 11:03:21.518 3017-3663/com.example.dbtest W/System.err:     at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:130)
2020-06-19 11:03:21.518 3017-3663/com.example.dbtest W/System.err:     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:329)
2020-06-19 11:03:21.519 3017-3663/com.example.dbtest W/System.err:     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:246)
2020-06-19 11:03:21.519 3017-3663/com.example.dbtest W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457)
2020-06-19 11:03:21.519 3017-3663/com.example.dbtest W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:405)
2020-06-19 11:03:21.519 3017-3663/com.example.dbtest W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:243)
2020-06-19 11:03:21.521 3017-3663/com.example.dbtest W/System.err:     at com.example.dbtest.MainActivity$MyAsyncTaskgetNews.doInBackground(MainActivity.java:69)
2020-06-19 11:03:21.521 3017-3663/com.example.dbtest W/System.err:     at com.example.dbtest.MainActivity$MyAsyncTaskgetNews.doInBackground(MainActivity.java:44)
2020-06-19 11:03:21.522 3017-3663/com.example.dbtest W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:305)
2020-06-19 11:03:21.522 3017-3663/com.example.dbtest W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
2020-06-19 11:03:21.523 3017-3663/com.example.dbtest W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
2020-06-19 11:03:21.523 3017-3663/com.example.dbtest W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
2020-06-19 11:03:21.523 3017-3663/com.example.dbtest W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
2020-06-19 11:03:21.523 3017-3663/com.example.dbtest W/System.err:     at java.lang.Thread.run(Thread.java:761)

有誰知道問題可能是什么? 任何幫助表示贊賞。

PS:對不起我的英語不好,這不是我的母語。

我終於弄明白了。

我在自定義虛擬主機上運行了 API,因此模擬器無法連接到我的自定義虛擬主機。 我將我的 API 移動到“原始”localhost 文件夾並在代碼中編輯了我的 url。 我的 url 現在看起來像這樣:

String url = "http://10.0.2.2/test.php?username="+ username +"&password="+ password;

我發現 ip 10.0.2.2是您機器 localhost 的快捷方式。

如果有任何問題,我會盡力提供幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM