Articles of retrofit2

Retrofit API调用收到“HTTP FAILED:java.io.IOException:Cancelled”

无法弄清楚为什么会这样。 我的调用不会触发任何一个rx回调(onCompleted(),onError(),onNext())。 我收到的唯一的东西是这个okhttp输出: D/OkHttp: –> GET https://api.privatbank.ua/p24api/exchange_rates?json=true&date=20.11.2016 http/1.1 D/OkHttp: –> END GET D/OkHttp: <– HTTP FAILED: java.io.IOException: Canceled 改造模块: @Module public class RestModule { @Provides @Singleton public HttpLoggingInterceptor providesHttpLogginInterceptor() { return new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY); } @Provides @Singleton public OkHttpClient providesOkHttpClient(@NonNull HttpLoggingInterceptor loggingInterceptor) { return new OkHttpClient.Builder() .addInterceptor(loggingInterceptor) .connectTimeout(ConstantsManager.CONNECTION_TIME_OUT, TimeUnit.SECONDS) .readTimeout(ConstantsManager.READ_TIME_OUT, TimeUnit.SECONDS) .build(); } @Provides @Singleton public […]

如果快速调用,android LiveData Observable不会返回数据

处理需要一次性向同一端点发送多个API调用的应用程序。 例如 – 目录浏览方案,需要通过发送当前文件夹中所有文件夹的get调用来获取目录结构。 问题是,响应正确地为所有文件夹单独响应,但LiveData observable只给出了整个列表的一个响应。 目录结构: – test -> temp -> temp1 -> temp2 -> temp3 -> temp4 可观察到收听回调: – mViewModel.getServerFilesLiveData().observe(this, browseServerDataResource -> { if (browseServerDataResource != null) { if (browseServerDataResource.status == APIClientStatus.Status.SUCCESS) { if (browseServerDataResource.data != null) { Timber.i(“Got data for path %s in Observable”, browseServerDataResource.data.path); if (browseServerDataResource.data.folderList != null && browseServerDataResource.data.folderList.size() > […]

与Retrofit 2并行执行http请求

我想在Retrofit 2中实现多个并行请求。我有以下结构来发出3个请求: HistoricalRApi.IStockChart service=HistoricalRApi.getMyApiService(); //^BVSP,^DJI,^IXIC Call call1= service.get1DHistoricalDataByStock(“^IXIC”); Call call2= service.get1DHistoricalDataByStock(“^DJI”); Call call3= service.get1DHistoricalDataByStock(“^GSPC”); call1.enqueue(retrofitCallbackAmerica()); call2.enqueue(retrofitCallbackAmerica()); call3.enqueue(retrofitCallbackAmerica()); } 我已经在Retrofit1中看到,在定义其余适配器时,可以使用.setExecutor定义并行请求,如下所示: RestAdapter adapter = new RestAdapter.Builder() .setEndpoint(END_POINT) .setLogLevel(RestAdapter.LogLevel.FULL) .setExecutors(Executors.newFixedThreadPool(3), null) .build(); 我的问题是如何在Retrofit 2中实现同样的目标? 提前致谢

检测OkHttp响应是否来自缓存(使用Retrofit)

有没有办法检测Retrofit响应是来自配置的OkHttp缓存还是实时响应? 客户定义: Cache cache = new Cache(getCacheDirectory(context), 1024 * 1024 * 10); OkHttpClient okHttpClient = new OkHttpClient.Builder() .cache(cache) .build(); Api定义: @GET(“/object”) Observable<Result> getSomeObject(); 示例电话: RetroApi retroApi = new Retrofit.Builder() .client(okHttpClient) .baseUrl(baseUrl) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build() .create(RetroApi.class); result = retroApi.getSomeObject().subscribe((Result someObjectResult) -> { isFromCache(someObjectResult); // ??? });

Dagger + Retrofit。 在运行时添加auth头

我想知道Dagger是否有办法知道它应该在新数据可用时重新创建一个对象。 我所说的实例是我用于改造的请求标题。 在某些时候(当用户登录时),我得到一个令牌,我需要将其添加到改造的标题中以进行经过身份validation的请求。 问题是,我留下了相同的未经validation的改造版本。 这是我的注射码: @Provides @Singleton OkHttpClient provideOkHttpClient(Cache cache) { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(interceptor) .cache(cache).build(); client .newBuilder() .addInterceptor( chain -> { Request original = chain.request(); Request.Builder requestBuilder = original.newBuilder() .addHeader(“Accept”, “Application/JSON”); Request request = requestBuilder.build(); return chain.proceed(request); }).build(); return client; } @Provides @Singleton Retrofit provideRetrofit(Gson gson, […]

仅使用表单数据进行改造2

我正在尝试使用Retrofit 2发出POST请求。请求types是form-data NOT application/x-www-form-urlencoded 。 我只发布数据而不是请求中的文件,响应采用JSON格式。 我试过@FormUrlEncoded, @Multipart但它不能正常工作。 我试过以下请求 1.第一次尝试 @FormUrlEncoded @POST(“XXXX”) Call getPlanName(@Field(Constants.ACTION_ID) String actionId, @Field(Constants.OFFER_CODE) String offerCode); 2.第二次尝试 @Headers({“Content-Type: multipart/form-data”,”Content-Type: text/plain”}) @FormUrlEncoded @POST(“XXXX”) Call getPlans(@Body @FieldMap(encoded = false) Map data); 3.第三次尝试 @Headers(“Content-Type: multipart/form-data”) @Multipart @POST(“XXXX”) Call myPlans(@Part(Constants.ACTION_ID) String actionId, @Part(Constants.OFFER_CODE) String offerCode); 我只是将身体变为空 。 它正在与POSTMAN合作。 我还搜索了form-data和application/x-www-form-urlencoded ,发现如果数据是二进制的,那么使用form-data ,如果数据是ASCII,那么使用application/x-www-form-urlencoded 我正在尝试查找改造不支持表单数据吗? POSTMAN请求 Cache-Control: no-cache Postman-Token: […]

改造2 + RxJava取消/取消订阅

我正在执行网络请求,我发送文件和消息。 我想有一个取消当前请求的选项。 我发现了两个类似的问题,两者都表明observable.subscribe(Observer)返回了具有方法unsubscribe() Subscription对象。 这是第一个 第二个 在我的例子中,我使用observable.subscribe(Observer) ,它是无效的。 这是我的代码: Observable observable = mModel.sendMessage(message, companion, description, multiParts); observable.subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(MessengerRaw value) { if (getView() != null) { ((MessengerActivity) getView()).resetMessegeView(); ((MessengerActivity) getView()).updateMessageList(); } } @Override public void onError(Throwable e) { getData().remove(0); if (getView() != null) { […]

Retrofit 2无法上传带有两个额外字符串参数的文件

在问题的底部阅读编辑以寻找可能的替代解决方案,直到find解决方案 。 这是一个成功的post文件,其中包含两个使用POSTMan的参数。 我试图通过改造来做同样的事但收到BadRequest。 邮差设置: Chrome网络post详情: 现在,我在Android中如何做到这一点,但失败了: 改造服务接口: @Multipart @POST(“jobDocuments/upload”) Call upload(@Part(“file”) MultipartBody.Part file,@Part(“folder”) MultipartBody.Part folder,@Part(“name”) MultipartBody.Part name); 这是我的@Background方法,用于生成上述服务来运行网络请求 CustDataClient service = ServiceGenerator.createService(CustDataClient.class); File file = new File(fileUri.getPath()); // create RequestBody instance from file RequestBody requestFile = RequestBody.create(MediaType.parse(“multipart/form-data”), file); MultipartBody.Part fileData = MultipartBody.Part.createFormData(“file”, fileName, requestFile); MultipartBody.Part folder = MultipartBody.Part.createFormData(“folder”, “LeadDocuments”); MultipartBody.Part name = MultipartBody.Part.createFormData(“name”, fileName); […]

Rx 2 Android对于api调用有什么更好的Single或Observable?

当我们使用retrofit2与Rx进行APIrest调用时,使用的最佳方法是单一还是可观察? public interface ApiService{ Single getDataFromServer(); Observable getDataFromServer(); }

如何使用rxjava在retrofit 2.0中获取请求URL?

我正在尝试升级到Retrofit 2.0并在我的android项目中添加RxJava。 我正在进行api调用,并想要将sqlite中的响应数据作为缓存来检索url和它 Observable apiCall(@Body body); 并在RxJava调用中: myRetrofitObject.apiCall(body).subscribe(new Subscriber() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(MyResponseObject myResponseObject) { } }); 在Retrofit 1.9中,我们可以获得成功回调中的url: @Override public void success(MyResponseObject object, Response response) { String url=response.getUrl(); //save object data and url to sqlite } 如何使用RxJava进行Retrofit 2.0?