Java 如何从服务器获取响应?

Java 如何从服务器获取响应?,java,android,android-asynctask,android-volley,Java,Android,Android Asynctask,Android Volley,我正在编写一个类,其中包含对RESTAPI(Yandex磁盘)的请求。我使用截击,但我确实在从截击中得到回应时遇到了一些问题。您可以检查RESTAPI 我使用截击,可以在调试器中得到响应,但不能在我的活动中得到响应 这是我的请求课程 class Requests { private String response_of_server, token; private String url = "https://cloud-api.yandex.net/v1/disk"; p

我正在编写一个类,其中包含对RESTAPI(Yandex磁盘)的请求。我使用截击,但我确实在从截击中得到回应时遇到了一些问题。您可以检查RESTAPI

我使用截击,可以在调试器中得到响应,但不能在我的
活动中得到响应

这是我的
请求
课程

class Requests {
    private String response_of_server, token;
    private String url = "https://cloud-api.yandex.net/v1/disk";
    private Context context;

    Requests (String token, Context context) {
        this.token = token;
        this.context = context;
    }

    private void set_response_of_server(String response) {
        this.response_of_server = response;
    }

    String get_response() {
        return response_of_server;
    }

    void get_metadata_of_user() {

        try {
            /*Request*/

            RequestQueue queue = Volley.newRequestQueue(this.context);


            Response.ErrorListener error_listener = new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    error.printStackTrace();
                }
            };
            Response.Listener<String> response_listener = new Response.Listener<String>()
            {
                @Override
                public void onResponse(String response) {
                    set_response_of_server(response);
                }
            };

            StringRequest getRequest = new StringRequest(Request.Method.GET, url+"?fields=user", response_listener, error_listener) {
                @Override
                public Map<String, String> getHeaders() {
                    Map<String, String>  params = new HashMap<>();
                    params.put("Host", "cloud-api.yandex.net");
                    params.put("Authorization", token);
                    return params;
                }
            };
            queue.add(getRequest);
            /*Request end*/

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

check\u token()
函数此时应该只需向服务器发送响应即可。但是,我无法从服务器返回
Toast
或任何响应

您有一个
请求
类,该类具有调用服务器API的功能,该API是
异步的
。因此,在调用
请求后,您不会立即获得
结果检查令牌()函数中的code>

因此,我建议您修改
请求
类,如下所示

public class Requests {
    private String response_of_server, token;
    private String url = "https://cloud-api.yandex.net/v1/disk";
    private Context context;
    private HttpListener listener; // Add a listener to get the callback functionality

    Requests (String token, Context context, HttpListener listener) {
        this.token = token;
        this.context = context;
        this.listener = listener; // initialize the listener here
    }

    private void set_response_of_server(String response) {
        this.response_of_server = response;
        listener.onResponseReceived(response); // Send the response back to the calling class
    }

    String get_response() {
        return response_of_server;
    }

    void get_metadata_of_user() {

        try {
            RequestQueue queue = Volley.newRequestQueue(this.context);
            Response.ErrorListener error_listener = new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    error.printStackTrace();
                }
            };

            Response.Listener<String> response_listener = new Response.Listener<String>()
            {
                @Override
                public void onResponse(String response) {
                    set_response_of_server(response);
                }
            };

            StringRequest getRequest = new StringRequest(Request.Method.GET, url+"?fields=user", response_listener, error_listener) {
                @Override
                public Map<String, String> getHeaders() {
                    Map<String, String>  params = new HashMap<>();
                    params.put("Host", "cloud-api.yandex.net");
                    params.put("Authorization", token);
                    return params;
                }
            };

            queue.add(getRequest);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
public class MainActivity extends AppCompatActivity implements HttpListener {

    private final String ID_OF_APP = "Your token of app";

    // I fixed this part too. Please change if that is not useful
    private final String URL_FOR_CODE_QUERY = "https://oauth.yandex.com/authorize?response_type=" + SAVED_TOKEN + "&client_id=" + ID_OF_APP;
    private String SAVED_TOKEN = "";

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

        // ... I omitted some code

        Button btn_sign_in = findViewById(R.id.btn_sign_in);
        btn_sign_in.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText code_field = findViewById(R.id.code_field);
                String token = code_field.getText().toString();
                save_token(token);

                try {
                    // if(check_token()) {
                        // The check_token function call is Async. This will not return immediately. Hence you might consider removing this if part. Simply just call the function and listen to the callback function when the response is received
                    // }

                    check_token(); // Simply call the function here
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private void save_token(String token) {
        SharedPreferences sPref = getPreferences(MODE_PRIVATE);
        SharedPreferences.Editor ed = sPref.edit();
        ed.putString(SAVED_TOKEN, token);
        ed.apply();
    }

    private String load_token() {
        SharedPreferences sPref = getPreferences(MODE_PRIVATE);
        return sPref.getString(SAVED_TOKEN, "");
    }

    // I changed the return type as this is not returning anything.
    private void check_token() throws InterruptedException {
        String token = load_token();
        String result;
        Requests request = new Requests(token, this);
        request.get_metadata_of_user();

        // You will not get the response immediately here. So omit these codes.
        // result = request.get_response();
        // Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
        // return !(result.equals("-1"));
    }

    @Override
    public void onResponseReceived(String response) {
        // Here is your response. Now you can use your response
        // and can perform the next action here. 
    }
}
因此,您需要在
main活动中实现此
接口
,如下所示

public class Requests {
    private String response_of_server, token;
    private String url = "https://cloud-api.yandex.net/v1/disk";
    private Context context;
    private HttpListener listener; // Add a listener to get the callback functionality

    Requests (String token, Context context, HttpListener listener) {
        this.token = token;
        this.context = context;
        this.listener = listener; // initialize the listener here
    }

    private void set_response_of_server(String response) {
        this.response_of_server = response;
        listener.onResponseReceived(response); // Send the response back to the calling class
    }

    String get_response() {
        return response_of_server;
    }

    void get_metadata_of_user() {

        try {
            RequestQueue queue = Volley.newRequestQueue(this.context);
            Response.ErrorListener error_listener = new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    error.printStackTrace();
                }
            };

            Response.Listener<String> response_listener = new Response.Listener<String>()
            {
                @Override
                public void onResponse(String response) {
                    set_response_of_server(response);
                }
            };

            StringRequest getRequest = new StringRequest(Request.Method.GET, url+"?fields=user", response_listener, error_listener) {
                @Override
                public Map<String, String> getHeaders() {
                    Map<String, String>  params = new HashMap<>();
                    params.put("Host", "cloud-api.yandex.net");
                    params.put("Authorization", token);
                    return params;
                }
            };

            queue.add(getRequest);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
public class MainActivity extends AppCompatActivity implements HttpListener {

    private final String ID_OF_APP = "Your token of app";

    // I fixed this part too. Please change if that is not useful
    private final String URL_FOR_CODE_QUERY = "https://oauth.yandex.com/authorize?response_type=" + SAVED_TOKEN + "&client_id=" + ID_OF_APP;
    private String SAVED_TOKEN = "";

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

        // ... I omitted some code

        Button btn_sign_in = findViewById(R.id.btn_sign_in);
        btn_sign_in.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText code_field = findViewById(R.id.code_field);
                String token = code_field.getText().toString();
                save_token(token);

                try {
                    // if(check_token()) {
                        // The check_token function call is Async. This will not return immediately. Hence you might consider removing this if part. Simply just call the function and listen to the callback function when the response is received
                    // }

                    check_token(); // Simply call the function here
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private void save_token(String token) {
        SharedPreferences sPref = getPreferences(MODE_PRIVATE);
        SharedPreferences.Editor ed = sPref.edit();
        ed.putString(SAVED_TOKEN, token);
        ed.apply();
    }

    private String load_token() {
        SharedPreferences sPref = getPreferences(MODE_PRIVATE);
        return sPref.getString(SAVED_TOKEN, "");
    }

    // I changed the return type as this is not returning anything.
    private void check_token() throws InterruptedException {
        String token = load_token();
        String result;
        Requests request = new Requests(token, this);
        request.get_metadata_of_user();

        // You will not get the response immediately here. So omit these codes.
        // result = request.get_response();
        // Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
        // return !(result.equals("-1"));
    }

    @Override
    public void onResponseReceived(String response) {
        // Here is your response. Now you can use your response
        // and can perform the next action here. 
    }
}

请注意,代码没有经过测试。请根据您的要求进行修改。我希望这能帮助你理解这个问题

请检查我的答案,并让我知道这是否有效。:)我的编辑器没有将HttpListener视为模块。我可以在哪里安装它?只需创建一个Java类,如
HttpListener.Java
,然后将代码放在那里。这只是一个需要创建的简单java文件,就像您已经创建了activity类一样。