簡體   English   中英

如何在 Android Studio (RESTful API) 中從本地主機獲取 JSON 數據

[英]How to get JSON data from localhost in Android Studio (RESTful API)

所以我在 YT 上學習了一些關於如何使用 URL 從網站獲取 JSON 對象和 JSON 對象數組的教程,並且它起作用了。 代碼如下。 現在,我已經嘗試對我的 localhost 數據庫的 URL 做完全相同的事情,但是沒有用。 我沒有得到任何錯誤或任何東西,我不知道是什么問題。 我正在嘗試做一些 RESTful API,其中 java 中的代碼正在使用數據庫中的數據創建表,並且它運行良好,只是我無法將 android 應用程序連接到它。

package com.example.motto_app;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;

import javax.net.ssl.HttpsURLConnection;


public class MainActivity extends AppCompatActivity {

    RadioGroup RG;
    RadioButton bA, bB, bC, bD;
    TextView tA, tB, tC, tD, tQ;
    Button bN;



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


        //assigning variables to objects in layout
        RG = findViewById(R.id.radioGroup);

        bA = findViewById(R.id.answerAButton);
        bB = findViewById(R.id.answerBButton);
        bC = findViewById(R.id.answerCButton);
        bD = findViewById(R.id.answerDButton);

        tA = findViewById(R.id.answerAText);
        tB = findViewById(R.id.answerBText);
        tC = findViewById(R.id.answerCText);
        tD = findViewById(R.id.answerDText);

        tQ = findViewById(R.id.textQuestion);

        bN = findViewById(R.id.NextButton);



        //on-click listeners
        bN.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
                String url ="http://localhost:8080/quiz";


                JsonArrayRequest request = new JsonArrayRequest(Request.Method.GET, url, null, new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        String question = "";

                        try {
                            JSONObject cityInfo = response.getJSONObject(0);
                            question = cityInfo.getString("question");
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                        Toast.makeText(MainActivity.this, "Question: " + question, Toast.LENGTH_SHORT).show();
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(MainActivity.this, "Something wrong", Toast.LENGTH_SHORT).show();
                    }
                });


                queue.add(request);
            }
        });

        bA.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "AAA", Toast.LENGTH_SHORT).show();
            }
        });

        bB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "BBB", Toast.LENGTH_SHORT).show();
            }
        });

        bC.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "CCC", Toast.LENGTH_SHORT).show();
            }
        });

        bD.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "DDD", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

現在我只想補充一點,我從 YT 的原始代碼中更改的唯一內容是 URL 和變量名稱。 該代碼與標准 URL 完美配合。 這是我的本地主機的外觀: http://localhost:8080/quiz

本地主機是指您正在編程的 PC 還是 Android 設備本身?

如果您指的是 Android 設備本身 - 您永遠不會在這里使用 RESTful 服務。 您只需進行直接的數據庫調用。

在這種情況下,您的意思是您的 PC - 不是本地主機。 不是設備。 您需要使用設備的實際 IP。 即使您使用的是模擬器,模擬器也會認為它是一台單獨的機器並擁有自己的 IP 地址- localhost 只會轉到模擬器。 如果它是一個實際的設備而不是一個模擬器,你需要設置你的 WIFI 以允許該端口的流量(假設你的 PC 與你的設備在同一個 wifi 網絡上。如果不是,那就更復雜了)。

暫無
暫無

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

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