簡體   English   中英

如何在沒有 BufferedReader 的情況下從 Java 中的 http get 請求中檢索響應

[英]How can I retrieve the response from an http get request in Java WITHOUT BufferedReader

我知道有數以千計的文章和問答教我如何用 Java 發送 HTTP 請求。 但是它們都使用 BufferedReader 來讀取來自服務器的響應。

我不想使用 BufferedReader ,因為在我的 android 項目中使用它時遇到了“ OutOfMemoryError ”。 我不知道為什么會發生這種情況,而其他人卻成功了,但這肯定是經過長時間調試后由 BufferedReader 引起的,我真的厭倦了這個問題。 除了創建新的 BufferedReader 對象之外,還有什么方法可以檢索響應? 我只想發送一個最簡單的 get 請求,並獲取提供 HTML 內容的響應,而不考慮效率。

使用 OkHttp 進行高效的網絡訪問

OkHTTP 是什么? OkHTTP 是一個開源項目,旨在成為一個高效的 HTTP 客戶端。

// avoid creating several instances, should be singleon
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
                     .url("https://www.vogella.com/index.html")
                     .build();

您還可以添加參數

HttpUrl.Builder urlBuilder = HttpUrl.parse("https://api.github.help").newBuilder();
urlBuilder.addQueryParameter("v", "1.0");
urlBuilder.addQueryParameter("user", "vogella");
String url = urlBuilder.build().toString();

Request request = new Request.Builder()
                     .url(url)
                     .build();

來源https://www.vogella.com/tutorials/JavaLibrary-OkHttp/article.html

為此,您可以使用 Volley。 它快速、流暢且輕便。

在你的 build.gradle 文件中,添加這一行並編譯:

implementation 'com.android.volley:volley:1.1.1'

制作網絡單例

public class NetworkSingleton {
    private static NetworkSingleton instance;
    private RequestQueue requestQueue;
    private ImageLoader imageLoader;
    private static Context ctx;

    private NetworkSingleton(Context context) {
        ctx = context;
        requestQueue = getRequestQueue();

        imageLoader = new ImageLoader(requestQueue,
                new ImageLoader.ImageCache() {
                    private final LruCache<String, Bitmap>
                            cache = new LruCache<String, Bitmap>(20);

                    @Override
                    public Bitmap getBitmap(String url) {
                        return cache.get(url);
                    }

                    @Override
                    public void putBitmap(String url, Bitmap bitmap) {
                        cache.put(url, bitmap);
                    }
                });
    }

    public static synchronized NetworkSingleton getInstance(Context context) {
        if (instance == null) {
            instance = new NetworkSingleton(context);
        }
        return instance;
    }

    public RequestQueue getRequestQueue() {
        if (requestQueue == null) {
            // getApplicationContext() is key, it keeps you from leaking the
            // Activity or BroadcastReceiver if someone passes one in.
            requestQueue = Volley.newRequestQueue(ctx.getApplicationContext());
        }
        return requestQueue;
    }

    public <T> void addToRequestQueue(Request<T> req) {
        getRequestQueue().add(req);
    }

    public ImageLoader getImageLoader() {
        return imageLoader;
    }
}

發出字符串請求:

StringRequest stringRequest = new StringRequest(Request.Method.GET, "URL to fetch",
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                       //This is executed after successful response to URL
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        //If error occurs
                    }
                }) {
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String, String>  params = new HashMap<String, String>();
                params.put("Authorization", "Add a header to request");

                return params;
            }
        };

        NetworkSingleton.getInstance(getApplicationContext()).addToRequestQueue(stringRequest);

閱讀更多關於排球的信息:

https://developer.android.com/training/volley

您可以使用InputStream
例如:

HttpURLConnection conn=(HttpURLConnection)(new URL(your URL).openConnection());
InputStream is=conn.getInputStream();
String str=new String(is.readAllBytes());
is.close();
return str;

或 Java 11 HttpClient API。
例如:

HttpClient client=HttpClient.newHttpClient();
HttpRequest request=HttpRequest.newBuilder().uri(new URI(your URL)).GET().build();
HttpResponse<String> response=client.send(request,BodyHandlers.ofString());
return response.body();

暫無
暫無

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

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