0
votes

Comment puis-je récupérer la réponse d'une requête http get en Java SANS BufferedReader

Je sais qu'il existe des milliers d'articles et de questions / réponses qui m'apprennent à envoyer une requête HTTP en Java. Mais tous utilisent un BufferedReader pour lire la réponse du serveur.

Je ne souhaite pas utiliser de BufferedReader , car j'ai rencontré une " OutOfMemoryError " lors de son utilisation sur mon projet Android. Je ne sais pas pourquoi cela s'est produit alors que d'autres réussissent, mais cela a certainement été causé par BufferedReader après une longue période de débogage et je suis vraiment fatigué de ce problème. Existe-t-il un moyen de récupérer la réponse autre que la création d'un nouvel objet BufferedReader? Je souhaite simplement envoyer une requête get la plus simple et obtenir la réponse qui fournit du contenu HTML, sans tenir compte de l'efficacité.


5 commentaires

Utilisez-vous également inputReader.readLine? Si tel est le cas, essayez de lire avec une taille de tampon fixe: inputReader.read (char [] cbuf, int off, int len)


est-ce une application web java?


ne veut pas utiliser un BufferedReader, car j'ai rencontré un "OutOfMemoryError" . Non, ne le croyez pas. Votre erreur vient d'autre chose.


BufferedReader inputReader Pourquoi appelez-vous cela un inputReader? Très déroutant car vous avez également un nouveau InputStreamReader .....


n'envisagez-vous pas d'utiliser un package comme okhttp ou retrofit qui a un wrapper sur les connexions http


3 Réponses :


1
votes

Utilisez OkHttp pour un accès réseau efficace

Qu'est-ce que OkHTTP? OkHTTP est un projet open source conçu pour être un client HTTP efficace.

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();

Vous pouvez également ajouter des paramètres

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

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

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


1 commentaires

Eh bien, en fait, j'ai essayé OKHTTP hier, très simple et clair, mais j'ai trouvé que la plupart des contenus de leurs documents sont écrits en Kotlin, ce que je ne connais pas très bien, donc je préférerais choisir Volley. Mais merci pour votre réponse!



1
votes

Vous pouvez utiliser Volley pour cela. C'est rapide, fluide et léger.

Dans votre fichier build.gradle, ajoutez cette ligne et compilez:

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

Créez un singleton réseau

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);

Faites une requête de chaîne:

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;
    }
}

En savoir plus sur volley à:

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


2 commentaires

C'est super. Je suis vraiment fatigué de "ce flux", "ce flux" .... Volley semble beaucoup plus facile que HttpURLConnection.


Ouais, en effet. C'est propre.



0
votes

Vous pouvez utiliser InputStream
Par exemple:

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();

Ou API Java 11 HttpClient .
Par exemple:

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


0 commentaires