如何在没有 BufferedReader 的情况下从 Java 中的 http get 请求中检索响应
How can I retrieve the response from an http get request in Java WITHOUT BufferedReader
我知道在 Java 中有成千上万的文章和问答教我如何发送 HTTP 请求。但是他们都使用 BufferedReader 来读取服务器的响应。
我不想使用 BufferedReader,因为我在 [=21] 上使用它时遇到了“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;
或Java11HttpClient
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();
我知道在 Java 中有成千上万的文章和问答教我如何发送 HTTP 请求。但是他们都使用 BufferedReader 来读取服务器的响应。
我不想使用 BufferedReader,因为我在 [=21] 上使用它时遇到了“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;
或Java11HttpClient
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();