我StreamResetException: stream was reset: INTERNAL_ERROR从 OkHttp 得到的。有什么问题?
这是日志。
I/okhttp.OkHttpClient: <-- 200 https://www.example.com/user/list (396ms)
I/okhttp.OkHttpClient: date: Fri, 04 Dec 2020 02:21:35 GMT
I/okhttp.OkHttpClient: content-type: application/json
I/okhttp.OkHttpClient: content-length: 99730
I/okhttp.OkHttpClient: server: nginx/1.18.0
I/okhttp.OkHttpClient: allow: GET, HEAD, OPTIONS
I/okhttp.OkHttpClient: x-frame-options: DENY
I/okhttp.OkHttpClient: x-content-type-options: nosniff
I/okhttp.OkHttpClient: referrer-policy: same-origin
D/okhttp.Http2: << 0x00000003 5792 DATA
D/okhttp.Http2: << 0x00000003 4 RST_STREAM
D/okhttp.TaskRunner: Q10092 canceled : OkHttp ConnectionPool
D/force: okhttp3.internal.http2.StreamResetException: stream was reset: INTERNAL_ERROR
D/okhttp.Http2: >> 0x00000000 8 GOAWAY
D/okhttp.TaskRunner: Q10096 finished run in 216 ms: …Run Code Online (Sandbox Code Playgroud) 我无法找到Retrofit默认行为的好解释.
如果Okhttp在类路径上,它将自动使用.但据我所知,默认的HttpResponseCache为null.
我是否需要使用Retrofit和Okhttp显式启用缓存?
我的Android应用程序崩溃了以下堆栈跟踪,但是当我从桌面休息客户端尝试它时它运行良好.有谁知道问题可能是什么?
04-23 16:00:50.449 27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient? ---> HTTP GET http://beta2.irealtor.api.iproperty.com.my/Listing?pageSize=10000&orderby=1&order=-1
04-23 16:00:50.449 27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient? If-Modified-Since: 1398235278243
04-23 16:00:50.449 27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient? User-Agent: Android/0.0.20
04-23 16:00:50.449 27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient? Accept: application/json
04-23 16:00:50.449 27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient? Authorization: WFdSeW8vOTJ1Z3BoQlBJMk53VGpaekZRY2pCd1pYSlVXUT090
04-23 16:00:50.449 27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient? ---> END HTTP (0-byte body)
04-23 16:00:50.549 27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient? ---- ERROR http://beta2.irealtor.api.iproperty.com.my/Listing?pageSize=10000&orderby=1&order=-1
04-23 16:00:50.549 27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient? java.net.ProtocolException: Unexpected status line: {"Data":[],"CustomStatusCode":200,"Status":"success"}HTTP/1.1 200 OK
at com.squareup.okhttp.internal.http.StatusLine.<init>(StatusLine.java:38)
at com.squareup.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:150)
at com.squareup.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:99)
at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:595)
at com.squareup.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:381)
at com.squareup.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:328)
at com.squareup.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:493)
at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:71)
at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:38)
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:358) …Run Code Online (Sandbox Code Playgroud) 我正在使用OKHttp客户端的Retrofit来缓存来自JSON API的响应.
这很好用.
但是,如果我在设备上执行导致数据在服务器上更新的操作,我需要一种方法来"使某个特定路由无效",以确保下次请求此数据时,它将从服务器再次而不是现在过时的缓存版本.
目前,我通过在请求的Cache-Control标头中显式调用带有"no-cache"标志的新路由来解决这个问题,但是这迫使我在需要之前下载新数据,如果需要,可能会多次下载采取多个操作,只是为了使缓存保持最新.
有没有办法在我的改造/ OKhttp客户端中标记路由/方法,因为缓存已过期,需要在下次请求时通过网络进行强制更新?
我用来避免解析遍地的服务器响应,如果它也不会改变通过计算响应的哈希值:
public class HttpClient {
protected OkHttpClient mClient = new OkHttpClient();
public String get(final URL url, final String[] responseHash)
throws IOException {
HttpURLConnection connection = new OkUrlFactory(mClient).open(url);
InputStream inputStream = null;
MessageDigest messageDigest = null;
try {
messageDigest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
assert messageDigest != null;
try {
// Read the response.
inputStream = connection.getInputStream();
byte[] response = readFully(inputStream);
final byte[] digest = messageDigest.digest(response);
responseHash[0] = Base64.encodeToString(digest, Base64.DEFAULT);
return …Run Code Online (Sandbox Code Playgroud) 我正在从Android设备进行一个RESTful API调用以填充列表视图.
我使用swagger codegen来生成我的改造客户端.
Dagger 2用于依赖注入
设备:华硕Zenfone 5
我试图从邮递员,网络和模拟器(genymotion)拨打电话,与真实设备相比,它要快得多.
有趣的是,每当我重新启动手机两到三次请求时,响应时间是正常的,之后变慢.
我在okHTTP中阅读了一些关于gzip压缩的博客并尝试实现但没有效果.
如果有人可以帮助我找出问题,那将会非常有帮助.
(编辑我添加了一个小的演示测试)
我是新手Retrofit.我需要做的是XML从服务器检索文件并将其转换为POJO.问题是我的测试服务器上的所有内容都与静态文件完美配合,但是当我在真实服务器上尝试这个时,我无法使用它Retrofit2,但是当我直接使用时它确实有效OkHttp,所以有些东西是错误的生成Request我猜.
编辑:我切换代码使用String转换器只是简单的事情,因为问题只与响应有关.
这是我的基本实现.
public interface ZedoClient {
@retrofit2.http.Headers({
"User-Agent: Mozilla/5.0 (Linux; Android 5.1; Quattro_L50_HD LMY47D/Quattro_L50_HD)",
"Cookie : ZCBC=1;FFcat=3533,3,90;FFad=0;FFMChanCap=5345280B3533,3#2605191|0,1#0,24:"
})
@GET("fns.vast")
Call<Vast> getVast(@QueryMap(encoded=true) Map<String, String> options);
Run Code Online (Sandbox Code Playgroud)
我添加了两个Interceptor以便设置headers和cookies:
AddCookiesInterceptor.class
class AddCookiesInterceptor implements Interceptor {
private final Headers headers;
AddCookiesInterceptor(Headers headers) {
this.headers = headers;
}
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request.Builder builder = chain.request().newBuilder();
builder.headers(headers);
return chain.proceed(builder.build());
}
}
Run Code Online (Sandbox Code Playgroud)
ReceivedCookiesInterceptor.class …
我在一个 Android 项目中使用了改造 (2.7.2) 和 OkHttp 版本 (4.4.0),但我在请求时遇到了崩溃。
依赖项:
kapt("com.squareup.moshi:moshi-kotlin-codegen:1.9.2")
implementation 'com.squareup.moshi:moshi:1.9.2'
implementation 'com.squareup.retrofit2:retrofit:2.7.2'
implementation 'com.squareup.retrofit2:converter-moshi:2.7.2'
implementation("com.squareup.okhttp3:okhttp:4.4.0")
implementation("com.squareup.okhttp3:okhttp-tls:4.4.0")
implementation "com.squareup.okhttp3:logging-interceptor:4.4.0"
Run Code Online (Sandbox Code Playgroud)
碰撞:
java.lang.NoSuchMethodError: 没有虚拟方法 toString(Z)Ljava/lang/String; 在类 Lokhttp3/Cookie 中;或其超类('okhttp3.Cookie' 的声明出现在 /data/app/com.package-1/base.apk:classes3.dex 中)在 com.facebook 的 okhttp3.JavaNetCookieJar.saveFromResponse(JavaNetCookieJar.java:45) .react.modules.network.ReactCookieJarContainer.saveFromResponse(ReactCookieJarContainer.java:36) 在 okhttp3.internal.http.HttpHeaders.receiveHeaders(HttpHeaders.kt:207) 在 okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:85) ) 在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:100) 在 okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:74) 在 okhttp3.internal.http.RealInterceptorChain
我正在尝试使用Espresso和为我的 Fragments 编写 UI 测试MockWebServer。我OkHttp Idling Resource用来告诉 Espresso 等待 API 调用完成。
但不知何故,有时我的测试有效,但有时无效,因为Espresso在服务请求之前就完成了它的工作。所以我的 recyclerView 项目点击测试失败。
我不明白为什么 espresso 不等待 API 调用?任何人都可以帮忙吗?
这是我的测试课
@MediumTest
@HiltAndroidTest
@UninstallModules(PersistenceModule::class, NetworkModule::class)
class MainFragmentTest {
@get:Rule
var hiltRule = HiltAndroidRule(this)
private val mockWebServer = MockWebServer()
@Inject
lateinit var okHttp3IdlingResource: OkHttp3IdlingResource
@Before
fun setUp() {
hiltRule.inject()
// Prepare Mock Web Server
mockWebServer.start(8080)
IdlingRegistry.getInstance().register(okHttp3IdlingResource)
}
@Test
fun mainFragmentTest(){
// Prepare Mock Web Server
mockWebServer.dispatcher = object : Dispatcher() {
override fun dispatch(request: …Run Code Online (Sandbox Code Playgroud) 我试图学习如何使用 OkHTTP。我将库导入到我的项目中,但是当我编译代码时,它会出现此错误。
找不到 org.junit.jupiter:junit-jupiter:。需要者:project :app 在 build.gradle 文件中搜索。
请问我该怎么办。这是我的 build.gradle 下面
plugins {
id 'com.android.application'
}
android {
compileSdk 32
defaultConfig {
applicationId "com.omolayoseun.saprktesterapp"
minSdk 23
targetSdk 32
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-
rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
implementation 'org.junit.jupiter:junit-jupiter'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation 'com.squareup.okhttp3:okhttp:4.9.1'
// https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
}
Run Code Online (Sandbox Code Playgroud) okhttp ×10
android ×8
retrofit ×7
java ×4
http-caching ×2
retrofit2 ×2
caching ×1
dagger-2 ×1
dagger-hilt ×1
django ×1
http ×1
http-headers ×1
http2 ×1
react-native ×1
response ×1