标签: okhttp3

OKHTTP 3跟踪分段上传进度

如何在OkHttp 3中跟踪上传的进度我可以找到v2但不是v3的答案,就像这样

来自OkHttp配方的示例Multipart请求

private static final String IMGUR_CLIENT_ID = "...";
private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");

private final OkHttpClient client = new OkHttpClient();

public void run() throws Exception {
    // Use the imgur image upload API as documented at https://api.imgur.com/endpoints/image
    RequestBody requestBody = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("title", "Square Logo")
            .addFormDataPart("image", "logo-square.png",
                    RequestBody.create(MEDIA_TYPE_PNG, new File("website/static/logo-square.png")))
            .build();

    Request request = new Request.Builder()
            .header("Authorization", "Client-ID " + IMGUR_CLIENT_ID)
            .url("https://api.imgur.com/3/image")
            .post(requestBody)
            .build();

    Response response = client.newCall(request).execute();
    if (!response.isSuccessful()) throw new IOException("Unexpected code …
Run Code Online (Sandbox Code Playgroud)

android okhttp3

12
推荐指数
2
解决办法
8417
查看次数

OkHTTPClient代理验证如何?

问题:如何向OkHTTP添加授权代理.

我知道OkHTTP的构建器确实支持代理,尽管我很难设置代理.

/**
 * Given a Url and a base64 encoded password return the contents of a website.
 * @param urlString
 * @param password
 * @return JSON
 */
public String getURLJson(String urlString, String password) {       
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(60, TimeUnit.SECONDS)
                .writeTimeout(60, TimeUnit.SECONDS)
                .readTimeout(60, TimeUnit.SECONDS)
                .build();

        Request request = new Request.Builder()
          .url(urlString)
          .get()
          .addHeader("authorization", "Basic " + password)
          .addHeader("cache-control", "no-cache")
          .build();

        Response response = null;
        try {
            response = client.newCall(request).execute();
            String string = response.body().string(); …
Run Code Online (Sandbox Code Playgroud)

java proxy okhttp okhttp3

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

将cookie添加到客户端请求OkHttp

所以我开始使用Okhttp 3,网上的大多数例子都是关于旧版本的

我需要在OkHttp客户端请求中添加一个cookie,如何用OkHttp 3完成?

在我的情况下,我只是想静态地将它添加到客户端调用而不从服务器接收它

android okhttp okhttp3

12
推荐指数
3
解决办法
3万
查看次数

如何获取OkHttp3重定向的URL?

有没有办法获取请求的最终URL?我知道我可以自己禁用重定向,但有没有办法获取我正在加载的当前URL?就像,如果我要求a.com并被重定向到b.com,有没有办法获得url b.com的名称?

java networking android okhttp okhttp3

12
推荐指数
2
解决办法
6198
查看次数

RxJava2/Retrofit2 - 为204 PUT和DELETE请求处理null

因此,我正在使用一个明确定义的API,旨在不返回有效负载主体DELETE和PUT操作.

这在Rx 0.X和Rx 1.x中是可接受的.现在我正在更新到Rx 2并且存在一个存在的危机,我应该如何处理空值.内容长度和正文当然是null,导致:

java.lang.NullPointerException: Null is not a valid element
   at io.reactivex.internal.queue.SpscLinkedArrayQueue.offer(SpscLinkedArrayQueue.java:68)
   at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.onNext(ObservableObserveOn.java:116)
   at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.onNext(ObservableSubscribeOn.java:63)
Run Code Online (Sandbox Code Playgroud)

在doOnNext中.

我见过很多人的建议Optional<>但是我也需要支持Java7以用于用例原因.我尝试了后端移植,但我无法让它工作.我也不想膨胀并为他们的版本导入Guava库.

我也注意到flatMap也可以帮我处理这个与地图相反的问题,而我正在阅读这些差异.

目前我有一个非常粗糙的OkHttp3拦截器,它将检查状态,检查有效负载是否为空,并添加错误的虚拟内容.

我也试过添加转换工厂.

任何人都可以提供建议并指导我正确的道路是什么?当然,API可以改变,但204不应该因为它的定义为HTTP状态代码而具有有效载荷.

相关依赖

compile('com.squareup.retrofit2:retrofit:2.1.0') {
     exclude module: 'okhttp'
} 
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
compile 'com.squareup.okhttp3:okhttp:3.5.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'

compile 'io.reactivex.rxjava2:rxjava:2.0.5'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.trello.rxlifecycle2:rxlifecycle:2.0.1'
compile 'com.trello.rxlifecycle2:rxlifecycle-components:2.0.1'
Run Code Online (Sandbox Code Playgroud)

rx-java retrofit2 okhttp3

12
推荐指数
2
解决办法
5223
查看次数

当我在拦截器中抛出异常时,Retrofit会崩溃

我有一个处理一些身份验证的拦截器.如果身份验证失败,则抛出和异常.根据我可以发现抛出异常应该导致onFailure在我处理异常的地方被调用.不幸的是,这不会发生,应用程序完全崩溃.我相信我一定会错过一些东西,但我似乎无法弄明白.希望有人在这里可以帮助:)

代码和堆栈跟踪如下:

val client = OkHttpClient.Builder()
     // Add interceptor that throws
     .addInterceptor { chain ->
         throw Exception("test")
     }
     .build()

retrofit = Retrofit.Builder()
                .baseUrl(baseURL)
                .client(client)
                .build()

api = retrofit.create(ApiInterface::class.java)


// Create api call...

apicall.enqueue(object : Callback<T> {
    override fun onResponse(call: Call<T>?, response: retrofit2.Response<T>?) {
        // ....
    }

    override fun onFailure(call: Call<T>?, t: Throwable?) {
        // Expect to go here to handle the Exception. But the app crashes
    }
})
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪:

E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
                  Process: com.testapp.test.debug, PID: 28891
                  java.lang.Error: java.lang.Exception: …
Run Code Online (Sandbox Code Playgroud)

android kotlin retrofit2 okhttp3

12
推荐指数
1
解决办法
2603
查看次数

使用OkHttp检查套接字是连接还是断开的更好方法?

我正在使用OkHttp通过Android上的套接字发送和接收消息.

创建套接字连接 -

SocketListener listener = new SocketListener();

mOkHttpClient = new OkHttpClient.Builder()
    .readTimeout(0, TimeUnit.MILLISECONDS)
    .build();
Request request = new Request.Builder()
    .url(socketURL)
    .build();
mOkHttpClient.newWebSocket(request, listener);
Run Code Online (Sandbox Code Playgroud)

这是用于侦听所有Web套接字事件的SocketListener类 -

public final class SocketListener extends WebSocketListener { 
    @Override
    public void onOpen(WebSocket webSocket, Response response) {
       // doing something
       isSocketConnected = true;
    }

    @Override
    public void onMessage(WebSocket webSocket, String text) {
       // doing something
    }

    @Override
    public void onMessage(WebSocket webSocket, ByteString bytes) {
    }

    @Override
    public void onClosing(WebSocket webSocket, int code, String reason) {
       // …
Run Code Online (Sandbox Code Playgroud)

sockets android okhttp okhttp3

12
推荐指数
1
解决办法
2451
查看次数

OkHttp3永不超时互联网上的超时

首先,我已经阅读了很多关于我的问题的问题,但是它从来没有给我解决方案。以下是一些有关我的问题的阅读问题。

我也阅读了有关我的问题的这篇文章,但它也从未为我提供解决方案。

问题:

我在Web服务应用程序中使用Okhhtp3库。它工作正常,但是当互联网连接速度慢或连接不可靠时,它就卡住了,永远不会超时,也永远不会调用超时异常或失败方法。

这是客户端代码:

OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(20, TimeUnit.SECONDS)
            .writeTimeout(20, TimeUnit.SECONDS)
            .readTimeout(20, TimeUnit.SECONDS)
            .retryOnConnectionFailure(false)
            .build();
Run Code Online (Sandbox Code Playgroud)

20秒后如何获得超时异常或称为故障方法?

请帮我。谢谢

java android connection-timeout okhttp okhttp3

12
推荐指数
1
解决办法
999
查看次数

Android java.security.cert.CertPathValidatorException:未找到证书路径的信任锚

Android应用程序有三个主机进行身份验证和授权.最终主机是REST API.第一次使用Oauth身份验证和授权过程,它没有问题.

但是,如果用户在登录后杀死应用程序并访问REST API提供的服务,然后再次打开应用程序,则会出现此问题.在这种情况下,身份验证和授权过程不会发生,只有REST API.它导致java.security.cert.CertPathValidatorException 但它在第一次使用时工作(登录然后使用应用程序).

有人可以解释这个异常背后的情况,并且该应用程序有什么问题.如果根据此SO答案忽略认证例外,则此方法有效.

SSLSocketFactory sslSocketFactory = null;

        try {
            TrustManagerFactory tmf = TrustManagerFactory.getInstance(
                    TrustManagerFactory.getDefaultAlgorithm());
            // Initialise the TMF as you normally would, for example:
            try {
                tmf.init((KeyStore)null);
            } catch(KeyStoreException e) {
                e.printStackTrace();
            }
            TrustManager[] trustManagers = tmf.getTrustManagers();

            final X509TrustManager origTrustmanager = (X509TrustManager)trustManagers[0];

            // Create a trust manager that does not validate certificate chains
            TrustManager[] wrappedTrustManagers = new TrustManager[]{
                    new X509TrustManager() {
                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return origTrustmanager.getAcceptedIssuers(); …
Run Code Online (Sandbox Code Playgroud)

java security ssl android okhttp3

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

无法从缓存okHttp和retrofit加载数据

这是我的代码,我在这里调用api,并通过改造为okhttp定义缓存:

public class DemoPresenter {

    DemoView vDemoView;
    private Context mContext;

    public DemoPresenter(Context mcontext, DemoView vDemoView) {
        this.vDemoView = vDemoView;
        this.mContext = mcontext;
    }

    public void callAllProduct() {
        if (vDemoView != null) {
            vDemoView.showProductProgressBar();
        }


        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .cache(new Cache(mContext.getCacheDir(), 10 * 1024 * 1024)) // 10 MB
                .addInterceptor(new Interceptor() {
                    @Override
                    public okhttp3.Response intercept(Chain chain) throws IOException {
                        Request request = chain.request();
                        if (BasicUtility.isInternet(mContext)) {
                            request = request.newBuilder().header("Cache-Control", "public, max-age=" + 60).build();
                        } else {
                            request = request.newBuilder().header("Cache-Control", …
Run Code Online (Sandbox Code Playgroud)

android caching retrofit retrofit2 okhttp3

11
推荐指数
1
解决办法
2046
查看次数