如何在Android Studio (RESTful API)中从localhost获取JSON数据



所以我遵循了一些关于如何使用URL从网站获取JSON对象和JSON对象数组的YT教程,它工作了。代码如下。现在,我试着用我的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。下面是我的localhost: http://localhost:8080/quiz

你说的本地主机是指你正在编程的PC,还是android设备本身?

如果你指的是Android设备本身——你永远不会在这里使用RESTful服务。你可以直接打DB电话。

在这种情况下,你指的是你的PC-那不是本地主机。不是对着设备。请使用设备的实际IP地址。即使你使用的是模拟器,模拟器也会认为自己是一台独立的机器,并且有自己的IP地址——localhost只会访问模拟器。如果它是一个实际的设备,而不是一个模拟器,你需要设置你的WIFI,允许流量到该端口(假设你的电脑和你的设备在同一个WIFI网络上)。如果不是,那就更复杂了。