我正在尝试在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请求吗?
我需要在里面重试请求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) 我正在尝试遵循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) 使用OKhttp在Android中的multipart中上传单个大文件(更具体地说,到s3)有什么选择?
我正在使用Retrofit和OkHttp库.所以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) 在okhttp库中没有请求主体的情况下制作OkHTTP发布请求的可能方法?
我正在使用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应用程序中,我使用Retrofit和OkHttpClient启用了缓存来访问某些API.我们的一些API有时会返回空数据.我们在应用程序中提供"刷新"按钮,以便客户端从特定API重新加载数据.
如何告诉OkHttpClient特定请求应忽略缓存条目.或者,是否有机制删除对应于单个请求的缓存响应?
我看到Cache.remove(请求)方法,但它被标记为私有.
我们升级到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) okhttp ×10
android ×8
retrofit ×6
caching ×1
file-upload ×1
gson ×1
http-post ×1
httpclient ×1
interceptor ×1
java ×1
oauth-2.0 ×1
okhttp3 ×1
retrofit2 ×1
upload ×1