- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为 android 中的 HttpUrlConnection 实现 ResponseCache。一切似乎都有效。我叫
ResponseCache.setDefault(new ResCache());
我的 ResCache 类中的方法正在按预期使用。我遇到的唯一问题是带有请求参数的 map 是空的。如果我在 android 环境之外尝试这个完全相同的代码,我将能够看到请求 Header 参数,但在 Activity 中并且所有这些东西都不起作用。这是 Activity 的代码。
package com.httptest;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.CacheRequest;
import java.net.CacheResponse;
import java.net.HttpURLConnection;
import java.net.ResponseCache;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
public class HttpTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ResponseCache.setDefault(new ResCache());
HttpURLConnection urlConnection = null;
try {
URL url = new URL("http://169.254.198.146//patch/500.php");
urlConnection = (HttpURLConnection) url
.openConnection();
urlConnection.setUseCaches(true);
urlConnection.setRequestProperty("MY_PROPERTY", "MY_VALUE");
InputStream in = new BufferedInputStream(
urlConnection.getInputStream());
String aux = readStream(in);
}catch(Exception e){
e.printStackTrace();
}finally {
urlConnection.disconnect();
}
}
public static String readStream(InputStream in) throws IOException {
StringBuilder sb = new StringBuilder();
BufferedReader r = new BufferedReader(new InputStreamReader(in), 1000);
for (String line = r.readLine(); line != null; line = r.readLine()) {
sb.append(line);
}
in.close();
return sb.toString();
}
public class ResCache extends ResponseCache{
@Override
public CacheResponse get(URI arg0, String arg1,
Map<String, List<String>> arg2) throws IOException {
System.out.println(arg2);
return null;
}
@Override
public CacheRequest put(URI uri, URLConnection connection)
throws IOException {
return null;
}
}
}
在方法 ResCache.get(URI, String, Map) 中, map 始终为空。我想查看我添加到请求中的参数。顺便说一句,参数在请求中设置得很好,因为我可以在执行请求时在服务器中读取它们。
同样,这在 android 环境之外工作。
有什么帮助吗?
谢谢!
最佳答案
我认为 Android 的 HttpURLConnection 实现中存在一个错误,其中将响应 header 而不是请求 header 传递给此方法。
我已经在我的代码中解决了这个问题,如下所示,尽管我没有通过谷歌搜索有关 android 中错误的更多详细信息,但我非常确信 android 对 httpurlconnection 的实现存在一些问题,正如您所看到的,它适用于非-android jvms:
基本上我通过传递 VirenRequestHeadersMap 而不是传递 URLConnection#getRequestProperies() 来修复它,以便与从 put(...) 传递的值保持一致。
@Override
public CacheRequest put(URI uri, URLConnection connection)
throws IOException {
MyPrivateContext context = <>;
context.setConnection(connection);
//...
}
@Override
public CacheResponse get(URI arg0, String arg1,
Map<String, List<String>> arg2) throws IOException {
System.out.println(arg2);
MyPrivateContext context = <>;
URLConnection connection = context.getConnection();
arg2 = new VirenRequestHeadersMap(connection);
//...
}
这里是整个 VirenRequestHeadersMap 类,如果您对它的外观感到好奇的话:
class VirenRequestHeadersMap implements Map<String, List<String>> {
private final URLConnection mConnection;
public VirenRequestHeadersMap(URLConnection connection) {
mConnection = connection;
}
public void clear() {
throw new UnsupportedOperationException();
}
public boolean containsKey(Object key) {
if (key instanceof String) {
String field = (String) key;
return mConnection.getRequestProperty(field) != null;
} else {
return false;
}
}
public boolean containsValue(Object value) {
throw new UnsupportedOperationException();
}
public Set<Entry<String, List<String>>> entrySet() {
throw new UnsupportedOperationException();
}
public List<String> get(Object key) {
if (key instanceof String) {
String field = (String) key;
String value = mConnection.getRequestProperty(field);
return value != null ? Collections.singletonList(value) : null;
} else {
return null;
}
}
public boolean isEmpty() {
throw new UnsupportedOperationException();
}
public Set<String> keySet() {
throw new UnsupportedOperationException();
}
public List<String> put(String key, List<String> value) {
throw new UnsupportedOperationException();
}
public void putAll(Map<? extends String, ? extends List<String>> value) {
throw new UnsupportedOperationException();
}
public List<String> remove(Object key) {
throw new UnsupportedOperationException();
}
public int size() {
throw new UnsupportedOperationException();
}
public Collection<List<String>> values() {
throw new UnsupportedOperationException();
}
}
关于Android 和 ResponseCache...请求 header 丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6541307/
在 ASP.NET Core 应用程序中,我有一个返回一些数据的操作方法。我想在客户端缓存这些数据。所以基于documentation here我可以在操作方法上使用 ResponseCache 属性
我试图了解 .NET Core 3.1 中的响应缓存。但它没有如我所愿。我在 Chrome devtool 中查看了网络,它显示了带有 cache-control: no-cache, no-stor
我有一个 Controller 操作,它呈现一个部分 View ,该 View 从数据库异步获取一些数据。假设这些是菜单项。 [Route("SomeData")] [Respons
我正在为 android 中的 HttpUrlConnection 实现 ResponseCache。一切似乎都有效。我叫 ResponseCache.setDefault(new ResCache(
我在默认缓存 Location = ResponseCacheLocation.Any 的操作方法上有一个 [ResponseCache] 属性。但在少数情况下,我只想将此属性覆盖为 Response
这是我的 View 组件: public class Categories: ViewComponent { private readonly ICategoryService _catego
我想在 asp.net core 2.0 中使用服务器端响应缓存(输出缓存),并发现了 Response Caching Middleware并想尝试一个全新的 asp.core mvc 项目。 这是
我想在客户端浏览器中缓存主页 但是设置ResponseCache属性后,响应头设置为Cache-Control: no-cache, no-store 看完Response cache not wor
我想在客户端浏览器中缓存主页 但是设置ResponseCache属性后,响应头设置为Cache-Control: no-cache, no-store 看完Response cache not wor
我是一名优秀的程序员,十分优秀!