我有一个应用程序,有很多现有的改装1.9接口。我想开始升级到改装2。以增量方式(目前不可能一次完成),获得对RxJava调用适配器的支持(因为1.9不再开发)。
让Reform1的RestAdapter共享一个将在Reform2接口中使用的OkHttp3客户端相当简单。版本1.9和2。x也有不同的maven GroupID,因此这些类可以并排存在,没有任何问题。
但是,我在运行时遇到以下异常:
java.lang.IllegalAccessError: Method 'com.google.gson.stream.JsonWriter com.google.gson.Gson.newJsonWriter(java.io.Writer)' is inaccessible to class 'retrofit2.converter.gson.GsonRequestBodyConverter'
改装1对GSON 2.3.1有严格的依赖性,该方法已在GSON 2.4中公开。我已经设置了Gradle依赖项,以便GSON依赖项解析为v2.7(我发布本文时的最新版本):
build.gradle代码
compile('com.squareup.retrofit:retrofit:1.9.0') {
exclude module: 'gson'
}
compile 'com.jakewharton.retrofit:retrofit1-okhttp3-client:1.1.0'
compile "com.squareup.retrofit2:retrofit:2.3.0"
compile "com.squareup.retrofit2:converter-gson:2.3.0"
compile "com.squareup.retrofit2:adapter-rxjava:2.3.0"
compile 'com.google.code.gson:gson:2.7'
正在运行<代码>/gradlew:app:dependencies表示正在解决GSON 2.7,但运行时行为可疑。。。
更新:我发现第三方硬件SDK在其AAR中捆绑了GSON 2.3.1。不过,我不知道如何删除它。
我最近与1.9版一起实施了2.9.0版改型,因为2版处理会话的能力要好得多,而且我的一个API调用由于缺少处理响应cookie(会话)而失败。
我也有同样的问题,将整个项目迁移到翻新2在此时是不可行的。但我可以确认它正在工作。
我将向您展示我如何实现1.9和2.9.0的片段。请参阅底部的完整类链接。
对于这两者:创建一个类,从中可以访问改装对象并从以下位置调用接口:
public class ApiManager {
private static final String TAG = "API MANAGER";
private static final String API_URL = BuildConfig.API_URL;
private static Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
.setLenient()
.create();
// The rest of the class to follow
然后具体到1.9:
private static RequestInterceptor requestInterceptor = new RequestInterceptor() {
@Override
public void intercept(RequestInterceptor.RequestFacade request) {
SessionManager sessionManager = new SessionManager(ContextHandler.getContext());
HashMap session = sessionManager.getUserDetails();
Object session_id = session.get("session_id");
Object token = session.get("token");
if (session_id != null && token != null) {
request.addHeader("Cookie", "session_id=" + session_id + ";");
request.addHeader("Cookie", "token=" + token + ";");
Log.i("INTERCEPT", "Sent Cookies");
}
request.addHeader("Accept", "application/json");
}
};
public static OkHttpClient getClient() {
// init okhttp 3 logger
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
JavaNetCookieJar jncj = new JavaNetCookieJar(CookieHandler.getDefault());
OkHttpClient client = new OkHttpClient();
client.newBuilder()
.addInterceptor(new AddCookiesInterceptor(ContextHandler.getContext()))
.addInterceptor(new ReceivedCookiesInterceptor(ContextHandler.getContext()))
.addNetworkInterceptor(logging)
.cookieJar(jncj)
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.MINUTES);
return client;
}
private static final RestAdapter REST_ADAPTER = new RestAdapter.Builder()
.setEndpoint(API_URL) // On device
.setRequestInterceptor(requestInterceptor)
.setClient(new Ok3Client(getClient()))
.setConverter(new GsonConverter(gson))
.setLogLevel(RestAdapter.LogLevel.FULL) //log the request
.build();
public interface AuthenticationInterface {
@Headers("Content-type: application/json")
@POST("/auth/getsession")
void Authenticate(@Body Authentication Auth, Callback<SessionStore> response);
@Headers("Content-type: application/json")
@GET("/auth/logout")
void logout(Callback<String> response);
@Headers("Content-type: application/json")
@GET("/auth/logout")
String logout();
}
// Bind REST_ADAPTER to Interface
public static final AuthenticationInterface AUTHENTICATION_INTERFACE = REST_ADAPTER.create(AuthenticationInterface.class);
// Use this when you want to run the request.
public static AuthenticationInterface getAuthenticationService(){ return AUTHENTICATION_INTERFACE; }
因此,您可以按如下方式使用上述内容:
ApiManager.getAuthenticationService().Authenticate(auth, new Callback<SessionStore>() {
@Override
public void success(SessionStore sessionStore, Response response) {
// Do somthing
}
@Override
public void failure(RetrofitError error) {
// Handle Error
}
});
对于2.9.0:
public static OkHttpClient getHeader() {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient okClient = new OkHttpClient.Builder()
.addInterceptor(interceptor)
.addInterceptor(new AddCookiesInterceptor(ContextHandler.getContext()))
.addInterceptor(new ReceivedCookiesInterceptor(ContextHandler.getContext()))
.cookieJar(cookieJar)
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.MINUTES)
.addNetworkInterceptor(
new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request request = null;
Log.d("--Authorization-- ", "authorizationValue");
Request original = chain.request();
// Request customization: add request headers
Request.Builder requestBuilder = original.newBuilder();
SessionManager sessionManager = new SessionManager(ContextHandler.getContext());
HashMap session = sessionManager.getUserDetails();
Object session_id = session.get("session_id");
Object token = session.get("token");
if (session_id != null && token != null) {
requestBuilder.addHeader("Cookie", "session_id=" + session_id + ";");
requestBuilder.addHeader("Cookie", "token=" + token + ";");
Log.i("INTERCEPT", "Sent Cookies");
}
requestBuilder.addHeader("Accept", "application/json");
request = requestBuilder.build();
return chain.proceed(request);
}
})
.build();
return okClient;
}
private static final Retrofit REST_ADAPTER2 = new Retrofit.Builder()
.baseUrl(API_URL) // On device
.client(getHeader())
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
public interface JasperReportsInterface {
/**
*
* @param agent_id
* @param report_id
*/
@retrofit2.http.Headers("Content-type: application/json")
@retrofit2.http.GET("/agents/{agent_id}/reports/{report_id}/")
Call<Reports> GetAgentReportView(@retrofit2.http.Path("agent_id") String agent_id, @retrofit2.http.Path("report_id") String report_id);
/**
*
* @param agent_id
* @param report_id
*/
@retrofit2.http.Headers("Content-type: application/json")
@retrofit2.http.GET("/agents/{agent_id}/reports/{report_id}/jobs")
Call<Jobs> PollAgentReportData(@retrofit2.http.Path("agent_id") String agent_id, @retrofit2.http.Path("report_id") String report_id);
/**
*
* @param agent_id
* @param report_id
* @param jsonBody
*/
@retrofit2.http.Headers("Content-type: application/json")
@retrofit2.http.POST("/agents/{agent_id}/reports/{report_id}/jobs")
Call<String> PostAgentReportData(@retrofit2.http.Path("agent_id") String agent_id, @retrofit2.http.Path("report_id") String report_id, @retrofit2.http.Body JsonObject jsonBody);
/**
*
* @param agent_id
* @param report_id
* @param jsonBody
*/
@retrofit2.http.Headers("Content-type: application/json")
@retrofit2.http.POST("/agents/{agent_id}/reports/{report_id}/jobs")
Call<String> DownloadAgentReportData(@retrofit2.http.Path("agent_id") String agent_id, @retrofit2.http.Path("report_id") String report_id, @retrofit2.http.Body JsonObject jsonBody);
}
// Bind REST_ADAPTER2 to Interface
public static final JasperReportsInterface JASPER_REPORTS_INTERFACE = REST_ADAPTER2.create(JasperReportsInterface.class);
// Use this when you want to run the request.
public static JasperReportsInterface getJasperReportsService(){ return JASPER_REPORTS_INTERFACE; }
您可以按如下方式使用上述内容:
Call<Reports> reportsCall = ApiManager.getJasperReportsService().GetAgentReportView(agentsID, reportTypeID);
reportsCall.enqueue(new retrofit2.Callback<Reports>() {
@Override
public void onResponse(Call<Reports> call, retrofit2.Response<Reports> response) {
if(response.isSuccessful()) {
report = response.body();
} else {
int statusCode = response.code();
// handle request errors yourself
ResponseBody errorBody = response.errorBody();
}
}
@Override
public void onFailure(Call<Reports> call, Throwable t) {
}
});
您需要的依赖项是1.9和2分别需要的基本依赖项。
完整课程请参见此处。
我正在使用改造2.x,我想记录请求和响应的标头和正文。 这是我正在做的,我的问题是请求的标题没有被记录在Android Monitor中,但其余的一切都被记录了。 Gradle版本 使用RC1和3.0.1由于错误问题报告错误链接
我正在尝试使用Reform2将图像上载到服务器,但不确定如何执行。 文档让我有点困惑,我尝试了这里提到的解决方案,但它对我不起作用。 这是我当前使用的代码片段,它不会向服务器发送任何内容: 然而,我可以通过使用TypedFile对1.9进行改装来很好地做到这一点。 是我做错了什么还是Retrofit2对这种事情有什么问题?
我试图使用改型在一些解析的JSON上执行一些代码,但是我得到了一个非法的状态异常。以下是我的改装实例: Coinbase Pro API接口: 对服务器的调用请求(这是导致错误的原因): 最后是JSON解析成的类对象: 因此,根据我从类似文章中收集的信息,发生非法状态异常是因为我试图传递给Gson的对象的类型不正确。但我不明白这是怎么回事,因为我正在使用改装;GsonConverterFactor
我正在尝试获取请求中发送的确切的JSON。下面是我的代码: 但我只在日志中看到这一点:
我正在使用Retrofit 2.4.0向服务器发送请求。但有时服务器会阻止我的请求,如果它与另一个请求的时间戳以毫秒为单位相似。我需要一次发送一个请求: 请求A已发送 是否可以使用Reformation和OkHttp库创建这样的队列?
在react组件中,通常不应在其中变异道具。此外,家长只能更改道具,不能直接更改状态。基于这两个事实,假设在任何componentDidUpdate调用中,例如。, 只读 这道具可能与prevProps不同,或者与此不同。状态可能与状态不同,但这两种情况不能同时发生?