标签: okhttp

Retrofit是否在主线程上进行网络调用?

我正在尝试在Android上探索Retrofit + OkHttp.这是我在网上找到的一些代码:

RestAdapter restAdapter = new RestAdapter.Builder().setExecutors(executor, executor)
.setClient(new OkClient(okHttpClient))
.setServer("blah").toString())
.build();
Run Code Online (Sandbox Code Playgroud)

如果我不使用执行程序服务,我的代码是否会在主线程上运行?我应该在新线程中发出Web请求吗?

android retrofit okhttp

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

通过OkHttp拦截器拦截和重试呼叫

我需要在里面重试请求OkHttp Interceptor.例如,存在需要Authorization令牌的传入请求.如果Authorization令牌已过期,则服务器返回带403代码的响应.在这种情况下,我正在检索一个新令牌并尝试使用相同的chain对象再次进行调用.

但是OkHttp会抛出一个异常,它声明你不能用同一个chain对象发出两个请求.

java.lang.IllegalStateException: network interceptor org.app.api.modules.ApplicationApiHeaders@559da2 must call proceed() exactly once
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一个干净的解决方案来解决内部重试网络请求的问题OkHttp Interceptor

谢谢

public final class ApplicationApiHeaders implements Interceptor {
    private static final String AUTHORIZATION = "Authorization";
    private TokenProvider mProvider;

    public ApplicationApiHeaders(TokenProvider provider) {
        mProvider = provider;
    }

    @Override
    public Response intercept(Chain chain) throws IOException {
        Token token = mProvider.getApplicationToken();
        String bearerToken = "Bearer " + token.getAccessToken();

        System.out.println("Token: " + bearerToken);
        Request request = …
Run Code Online (Sandbox Code Playgroud)

java interceptor retrofit okhttp

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

Retrofit 2示例教程但GsonConverterFactory显示错误"无法解析符号"

我正在尝试遵循Retrofit的2 教程,但是在这部分代码中有一个GsonConverterFactory显示错误Cannot resolve symbol:

public class ServiceGenerator {

    public static final String API_BASE_URL = "http://your.api-base.url";

    private static OkHttpClient httpClient = new OkHttpClient();
    private static Retrofit.Builder builder =
            new Retrofit.Builder()
                    .baseUrl(API_BASE_URL)
                    //THIS IS THE LINE WITH ERROR!!!!!!!!!!!!
                    .addConverterFactory(GsonConverterFactory.create());

    public static <S> S createService(Class<S> serviceClass) {
        Retrofit retrofit = builder.client(httpClient).build();
        return retrofit.create(serviceClass);
    }
}
Run Code Online (Sandbox Code Playgroud)

之前我在gradle.build中添加了,我不确定是否应该添加GSON,因为他们说Retrofit 1.9有它但是没有提到Retrofit 2:

dependencies {  
    // Retrofit & OkHttp
    compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
}
Run Code Online (Sandbox Code Playgroud)

android gson android-library retrofit okhttp

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

使用OKHttp,AsyncTask中的同步请求和OKhttp异步请求之间有什么区别?

OKHttp支持同步和异步api.如果我想发出异步请求,我可以:

  1. 使用AsyncTask,并发出OKhttp同步api.
  2. 发出OKhttp异步api.

这两个选项有什么区别?哪一个更好?

android network-programming android-asynctask okhttp

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

使用OkHttp在multipart中上传大文件

使用OKhttp在Android中的multipart中上传单个大文件(更具体地说,到s3)有什么选择?

upload android file-upload okhttp

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

Android Retrofit2刷新Oauth 2令牌

我正在使用RetrofitOkHttp库.所以Authenticator如果获得401响应,我有哪个authanticate用户.

build.gradle是这样的:

compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'com.squareup.okhttp3:okhttp:3.1.2'
Run Code Online (Sandbox Code Playgroud)

我的习惯Authenticator在这里:

import java.io.IOException;
import okhttp3.Authenticator;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.Route;

public class CustomAuthanticator  implements Authenticator {
@Override
public Request authenticate(Route route, Response response) throws IOException {

    //refresh access token via refreshtoken

    Retrofit client = new Retrofit.Builder()
            .baseUrl(baseurl)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    APIService service = client.create(APIService.class);
    Call<RefreshTokenResult> refreshTokenResult=service.refreshUserToken("application/json", "application/json", "refresh_token",client_id,client_secret,refresh_token);
    //this is syncronous retrofit request
    RefreshTokenResult refreshResult= refreshTokenResult.execute().body();
    //check if response equals 400 , …
Run Code Online (Sandbox Code Playgroud)

android oauth-2.0 okhttp retrofit2 okhttp3

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

如何在没有请求主体的情况下发出OKHTTP发布请求?

在okhttp库中没有请求主体的情况下制作OkHTTP发布请求的可能方法?

android http-post okhttp

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

使用基本HTTP身份验证更改POST请求:"无法重试流式HTTP正文"

我正在使用Retrofit来做一个基本的POST请求,我正在为请求提供一个基本的@Body.

@POST("/rest/v1/auth/login")
LoginResponse login(@Body LoginRequest loginRequest);
Run Code Online (Sandbox Code Playgroud)

当我为Retrofit构建界面时,我正在提供我自己的自定义OkHttpClient,而我正在做的就是添加我自己的自定义身份验证:

    @Provides
    @Singleton
    public Client providesClient() {
        OkHttpClient httpClient = new OkHttpClient();

        httpClient.setAuthenticator(new OkAuthenticator() {
            @Override
            public Credential authenticate(Proxy proxy, URL url, List<Challenge> challenges) throws IOException {
                return getCredential();
            }

            @Override
            public Credential authenticateProxy(Proxy proxy, URL url, List<Challenge> challenges) throws IOException {
                return getCredential();
            }
        });

        return new OkClient(httpClient);
    }
Run Code Online (Sandbox Code Playgroud)

当我使用OKHttp直接发送请求时,以及其他GET请求进行改造,但是当我使用改造来执行POST请求时,我会收到以下错误:

Caused by: java.net.HttpRetryException: Cannot retry streamed HTTP body
            at com.squareup.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:324)
            at com.squareup.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:508)
            at com.squareup.okhttp.internal.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:136)
            at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:94)
            at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:49)
            at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:357)
            at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:282)
            at …
Run Code Online (Sandbox Code Playgroud)

android http-authentication retrofit okhttp

25
推荐指数
4
解决办法
2万
查看次数

如何告诉OkHttpClient忽略缓存并强制刷新服务器?

在我的Android应用程序中,我使用Retrofit和OkHttpClient启用了缓存来访问某些API.我们的一些API有时会返回空数据.我们在应用程序中提供"刷新"按钮,以便客户端从特定API重新加载数据.

如何告诉OkHttpClient特定请求应忽略缓存条目.或者,是否有机制删除对应于单个请求的缓存响应?

我看到Cache.remove(请求)方法,但它被标记为私有.

android caching retrofit okhttp

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

Retrofit 2.0-beta-2正在为MultiPart值添加文字引号

我们升级到Retrofit 2.0并遇到了这个奇怪的问题.

我有一个方法来记录用户

public interface ApiInterface {

    @Multipart
    @POST("user/login/")
    Call<SessionToken> userLogin(@Part("username") String username, @Part("password") String password);
}
Run Code Online (Sandbox Code Playgroud)

当我查看服务器端的键值POST params时,它们就像这样打印

username : "brian"
password : "password"
Run Code Online (Sandbox Code Playgroud)

使用改造1.9的相同方法K:V对看起来像

username : brian
password : password
Run Code Online (Sandbox Code Playgroud)

它正在为POST变量添加文字引号

如果我使用任何其他休息客户端,变量打印就像没有引号的第二种方式.

以下是我使用拦截器构建Retrofit实例的方法

 OkHttpClient client = new OkHttpClient();
    client.interceptors().add(new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request original = chain.request();

            // Customize the request
            Request request = original.newBuilder()
                    .header("Accept", "application/json")
                    .header("Authorization", myPrefs.accessToken().getOr(""))
                    .method(original.method(), original.body())
                    .build();

            Response response = chain.proceed(request);

            // Customize or return the response …
Run Code Online (Sandbox Code Playgroud)

httpclient androidhttpclient retrofit okhttp

25
推荐指数
3
解决办法
4611
查看次数