标签: okhttp

流被重置:PROTOCOL_ERROR,同时在 3G 网络中使用 Retrofit

大家中午好!

Retrofit在我的应用程序中用于网络调用。该应用程序运行良好,速度非常快。感谢精彩的图书馆。但是,它仅适用于 wi-fi。如果我在 3G 网络中运行该应用程序,则会引发错误。stream was reset: PROTOCOL_ERROR, while using Retrofit in 3G network

我已将此 jar 文件导入到构建路径:

在此处输入图片说明

这是完整的堆栈跟踪:

11-17 16:01:54.017: D/Retrofit(3595): java.io.IOException: stream was reset: PROTOCOL_ERROR
11-17 16:01:54.017: D/Retrofit(3595):   at com.squareup.okhttp.internal.spdy.SpdyStream.getResponseHeaders(SpdyStream.java:146)
11-17 16:01:54.017: D/Retrofit(3595):   at com.squareup.okhttp.internal.http.SpdyTransport.readResponseHeaders(SpdyTransport.java:109)
11-17 16:01:54.017: D/Retrofit(3595):   at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:676)
11-17 16:01:54.017: D/Retrofit(3595):   at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:426)
11-17 16:01:54.017: D/Retrofit(3595):   at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:371)
11-17 16:01:54.017: D/Retrofit(3595):   at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:466)
11-17 16:01:54.017: D/Retrofit(3595):   at com.squareup.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:105)
11-17 16:01:54.017: D/Retrofit(3595):   at com.squareup.okhttp.internal.huc.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:25)
11-17 16:01:54.017: D/Retrofit(3595):   at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:73)
11-17 16:01:54.017: D/Retrofit(3595):   at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:38)
11-17 …
Run Code Online (Sandbox Code Playgroud)

networking android retrofit okhttp

8
推荐指数
2
解决办法
7544
查看次数

NetworkOnMainThread RxJava + Retrofit + Lollipop +

我在https使用Retrofit和运行api调用时收到Lollipop +上的NetworkOnMainThread异常报告RxAndroid.

我已经隔离了代码并创建了以下仍然失败的示例.

这是build.gradle:

apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'

android {
  compileSdkVersion 23
  buildToolsVersion "23.0.1"

  defaultConfig {
    applicationId "com.example.bug"
    minSdkVersion 9
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
  }
  buildTypes {
    release {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt')
    }
  }
  lintOptions {
    abortOnError false
  }
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])
  testCompile 'junit:junit:4.12'
  compile 'com.android.support:appcompat-v7:23.0.1'

  compile 'com.squareup.okhttp:okhttp:2.5.0'
  compile 'com.squareup.okhttp:okhttp-urlconnection:2.5.0'
  compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2'
  compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
  compile …
Run Code Online (Sandbox Code Playgroud)

rx-java retrofit okhttp rx-android

8
推荐指数
1
解决办法
1564
查看次数

无法导入com.squareup.okhttp.OkHttpClient;

我正在研究android studio并从网上获取一些数据.我尝试使用OkHttpClient并将jar添加到我的项目文件夹但仍然无法导入它.

它表明can't resolve symbol okhttp.我尝试了一些解决方案,但无法解决问题.这是我的build.gradle文件

apply plugin: 'com.android.application'
android {
    compileSdkVersion 23
    buildToolsVersion "23.0.0"

    defaultConfig {
        applicationId "com.example.app"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }


}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.0.0'
    compile 'com.google.android.gms:play-services:8.4.0'
 //   compile files('libs/okhttp-3.0.1.jar')
   // compile files('libs/okio-1.6.0.jar')


}
Run Code Online (Sandbox Code Playgroud)

android gradle okhttp

8
推荐指数
1
解决办法
2万
查看次数

Android OkHttp如何处理ETag

我尝试使用OkHttp进行Android离线缓存方法.流程是这样的:

  1. 我在头字段if-none-catched向服务器发送一个带有ETag空字符串的HTTP请求,服务器返回一个正确的ETag.
  2. 然后我存储ETag并缓存响应.
  3. 下次当我触发相同的服务调用时,我得到相同的ETag并将其设置为HTTP请求标头,如果ETag相同,服务器将返回HTTP 304.

我现在的问题是如何存储和检索ETag?OkHttp默认会处理还是我需要在SQLite存储?我一直在谷歌上看OkHttp实现ETag示例代码,但我得到的只是普通的缓存方法.链接我参考:

  1. 我正在尝试使用Java的HttpURLConnection来执行"条件获取",但我从未获得304状态代码
  2. https://github.com/square/okhttp/wiki/Interceptors
  3. 在Android中为OkHttp设置缓存的正确方法
  4. https://gist.github.com/polbins/1c7f9303d2b7d169a3b1#file-restcontroller-java-L45

到目前为止,我所获得的只是第一次服务调用的缓存,但不再从服务器获取最新数据.感谢是否有人可以提供一些指导或找到任何处理ETag和if-none-catch动态的OkHttp分享的好例子.任何澄清都可以随意询问.

etag android okhttp if-none-match

8
推荐指数
1
解决办法
5276
查看次数

Java OkHttp3只使用Http/1.1或Http/2

尝试为HTTP请求执行一些测试用例.我想区分HTTP/1.1和HTTP/2.为了做到这一点,我需要知道我从请求中使用了哪个版本.我还想强制请求使用HTTP/1.1或HTTP/2.我正在使用OkHttp3 for Java.这是一个简单的请求,我这样做:

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

Response response = client.newCall(request).execute();
return response.body().string();
Run Code Online (Sandbox Code Playgroud)

java okhttp okhttp3

8
推荐指数
1
解决办法
4968
查看次数

如何使用 okhttp 将 Api_KEY 添加到拦截器中

我有这个服务,我想将令牌作为 okhttp 中的拦截而不是作为参数传递给 @Header("MY_API_KEY")

这是我关于服务的代码

/**
     * Provides the [PHService]
     */
    fun provideService(): PHService {

        val logger = HttpLoggingInterceptor()
        logger.level = HttpLoggingInterceptor.Level.BASIC



        val client = OkHttpClient.Builder()
                .addInterceptor(logger)
                .build()

        return Retrofit.Builder()
                .baseUrl(BuildConfig.API_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .build()
                .create(PHService::class.java)
    }
Run Code Online (Sandbox Code Playgroud)

如何在此处添加用于标题授权的拦截器?

interceptor kotlin okhttp retrofit2 okhttp3

8
推荐指数
2
解决办法
6805
查看次数

MockwebServer 不模拟 http 调用

我最近发现了 MockWebServer 库,并尝试在我的项目中与 Junit 和mockito 一起使用它。

我有这个测试方法:

       @Test
       public void testGetUsers() throws Exception {
            MockWebServer server = new MockWebServer();
            server.start();
            MockResponse mockedResponse = new MockResponse();
            mockedResponse.setResponseCode(200);
            mockedResponse.setBody("{}");
            server.enqueue(mockedResponse);
            server.url("https://my-domain/user/api/users");
            JSONObject result = UserService.getUsers();
            assertNotNull(result);
            server.shutdown();
       }
Run Code Online (Sandbox Code Playgroud)

我的方法 getUsers() 执行 Http 调用:

public JSONObject getUsers() {
     String urlUser = "https://my-domain/user/api/users";
     Request request = new Request.Builder()
                .url(urlUser)
                .build();

     Response response = 
     MyConf.getOkHttpClient().newCall(request).execute();
     .... //process users and return a json Object
}
Run Code Online (Sandbox Code Playgroud)

这是我的 gradle 配置:

compile('com.squareup.okhttp3:okhttp:3.4.2')
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.1.0'
testImplementation 'com.squareup.okhttp3:mockwebserver:3.12.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.1.0'
testCompile …
Run Code Online (Sandbox Code Playgroud)

java okhttp mockwebserver

8
推荐指数
1
解决办法
1万
查看次数

如何在 Java 代码中使用 Kotlin 协程实现 NIO Socket(客户端)?

我想使用 Kotlin(v1.3.0)协程和 java.nio.channels。SocketChannel (NIO) 来替代connectAndroid 中的Socket (阻塞 IO)。因为这可以节省很多线程。

下面的代码因为job.await()在 Kotlin 中挂起函数而无法运行,它只能在 Ktolin 协程块中调用。喜欢launch{..}async{..}

// this function will be called by Java Code
fun connect(address: InetSocketAddress, connectTimeout: Int): SocketChannel {

    // Start a new connection
    // Create a non-blocking socket channel
    val socketChannel = SocketChannel.open()
    socketChannel.configureBlocking(false)

    // async calls NIO connect function
    val job = GlobalScope.async(oneThreadCtx) {
        aConnect(socketChannel, address)
    }

    // I what to suspend(NOT block) current Java Thread, until …
Run Code Online (Sandbox Code Playgroud)

android socketchannel kotlin okhttp kotlinx.coroutines

8
推荐指数
2
解决办法
7054
查看次数

Content-Disposition 值中 42 处的意外字符 0x662:表单数据;名称=“用户文件”;文件名="IMG_??????????_?????????.jpg"

我在我的 android 应用程序中使用本地化

虽然语言设置为阿拉伯语,但在 okhttp (okhttp:3.12.0) 的文件上传过程中出现此错误

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.prominere.health1, PID: 7502
    java.lang.IllegalArgumentException: Unexpected char 0x662 at 42 in Content-Disposition value: form-data; name="userfile"; filename="IMG_????????_?????????.jpg"
        at okhttp3.Headers.checkValue(Headers.java:272)
        at okhttp3.Headers.of(Headers.java:224)
        at okhttp3.MultipartBody$Part.createFormData(MultipartBody.java:259)
        at okhttp3.MultipartBody$Builder.addFormDataPart(MultipartBody.java:324)
        at com.prominere.health1.ProfileActivity.onValidationSucceeded(ProfileActivity.java:222)
        at com.mobsandgeeks.saripaar.Validator.triggerValidationListenerCallback(Validator.java:719)
        at com.mobsandgeeks.saripaar.Validator.validateFieldsWithCallbackTill(Validator.java:697)
        at com.mobsandgeeks.saripaar.Validator.validateUnorderedFieldsWithCallbackTill(Validator.java:679)
        at com.mobsandgeeks.saripaar.Validator.validate(Validator.java:334)
        at com.mobsandgeeks.saripaar.Validator.validate(Validator.java:295)
        at com.prominere.health1.ProfileActivity.onClick(ProfileActivity.java:139)
        at com.prominere.health1.ProfileActivity_ViewBinding$4.doClick(ProfileActivity_ViewBinding.java:81)
        at butterknife.internal.DebouncingOnClickListener.onClick(DebouncingOnClickListener.java:18)
        at android.view.View.performClick(View.java:5675)
        at android.view.View$PerformClick.run(View.java:22641)
        at android.os.Handler.handleCallback(Handler.java:836)
        at android.os.Handler.dispatchMessage(Handler.java:103)
        at android.os.Looper.loop(Looper.java:203)
        at android.app.ActivityThread.main(ActivityThread.java:6251)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
Run Code Online (Sandbox Code Playgroud)

我的代码块是

final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/*");
            formBody = …
Run Code Online (Sandbox Code Playgroud)

java android android-studio okhttp

8
推荐指数
1
解决办法
2197
查看次数

从 Android N (--min-api 24) 开始支持:okhttp3.Request okhttp3.Authenticator

仅从 Android N (--min-api 24) 开始支持静态接口方法: okhttp3.Request okhttp3.Authenticator.lambda$static$0(okhttp3.Route, okhttp3.Response)

android android-studio okhttp android-studio-3.0

8
推荐指数
1
解决办法
3600
查看次数