Articles of retrofit

我们是否有可能在OkHttp拦截器中停止请求?

在我们的应用程序中,我们遇到了一个特例 – 如果我们的App.specialFlag == true ,我们需要停止来自代码的任何请求。 我们认为,在这种情况下最好的方法是包括特殊的Interceptor ,它会阻止我们的任何请求,如下所示: if (App.specialFlag) { // Somehow stop request } else { return chain.proceed(chain.request()); } 另外,我们应该注意,我们使用RxJavaCallAdapterFactory将响应包装到Observable 。 但我们没有看到任何在OkHttp拦截器中停止请求的方法。 我们提出了两种解决问题的方法: a)创建特殊的ApiService.class用于包装我们的API中的每个请求,如下所示: public Observable getUserDetails() { if (App.specialFlag) { return Observable.just(null); } return api.getUserDetails(); } 但我们认为这是一个丑陋而繁琐的解决方案。 b)在Interceptor中抛出RuntimeException ,然后在我们使用API​​的每个地方捕获它。 第二个解决方案也不好,因为我们需要在链中包含很多onErrorResumeNext运算符。 可能有人知道,如何以更“聪明”的方式处理我们的情况? 提前致谢!

将JSON反序列化反序列化为其原始副本的$ ref引用

我使用Microsoft.Net和Breeze for API,我使用Retrofit得到的结果嵌套了重复的相同对象。 例如,EmployeeJob具有Customer导航属性,因此API结果如下所示 { Id:1, “Customer_Id”: 39, “Customer”: { “$id”: “2”, “$type”: “Wit.Trade.Entities.Customer, Wit.Trade”, “CourtesyTitle”: “Mr”, “FirstName”: “Ahmad” } } { Id:2 “Customer_Id”: 39, “Customer”: { “$ref”: “2” //here same customer Ahmad }, } 现在我得到的这些EmployeeJobs的Java List在第一条记录中只有Customer而其他的则没有。 如何将$ref:”2″映射到其原始值而不是$ref 。 我不希望我的服务器API出于网络和性能原因发送完整的对象,这就是为什么我想在客户端反序列化这些$refs ,就像Angularjs $resource service为我们做的那样。

改造关闭响应机构

我一直在收到这个错误: A connection to ****** was leaked. Did you forget to close a response body? 所以我继续关闭我得到的回复。 response.body().close() 问题是如果response.body()已经转换为自定义类,则没有可用的close方法。 我也尝试调用raw并给我一个例外: fetchSomething.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { //Closes the response body response.raw().body().close(); //<— gives illegalStateException } @Override public void onFailure(Call call, Throwable t) { } }); } 我该如何关闭它?

使用RxJava + Retrofit为列表中的每个项目发出API请求

我试图通过链接多个改进的api调用来创建一个observable。 步骤是: 使用api调用获取json对象列表 对于列表中的每个对象,进行另一个api调用以获取有关该项目的更多详细信息 将从此新详细对象获取的数据写入磁盘上的文件(对于列表中的每个项目都会发生这种情况) 最后返回一个单独的对象的observable,该对象要求为每个先前的对象创建一个文件 这是我到目前为止: public static Observable downloadFiles() { DownloadedFiles downloadedFiles = new DownloadedFiles(); Observable.create(subscriber -> { return getRestService().getObjectList() .flatMapIterable(objects -> objects) .flatMap(objectLimited -> getRestService().getObject(objectLimited.getPath())) .doOnNext(objectFull -> { try { File file = new File(); // Extract data from objectFull and write new file to disk // … } catch (IOException e) […]

使用Retrofit和RxJava下载并编写文件

我正在下载一个改装的pdf文件,我下载它的方式是块。 我使用Content-Range标头来获取一个字节范围,然后我需要在file上写这些字节,问题是编写它们的顺序。 我正在使用flatMap()函数为每个下载文件必须完成的请求返回一个observable。 .flatMap(new Func1<Integer, Observable>() { @Override public Observable call(Integer offset) { int end; if (offset + BLOCK_SIZE > (contentLength – 1)) end = (int) contentLength – 1 – offset; else end = offset + BLOCK_SIZE; String range = getResources().getString(R.string.range_format, offset, end); return ApiAdapter.getApiService().downloadPDFBlock(range); } }) downloadPDFBlock接收标头所需的字符串: Range: bytes=0-3999 。 然后我用subscribe函数写下载的字节 subscribe(new Subscriber() { […]

在改造中获得401未经授权,但在Postman和Swift中工作

在’技术的东西’前简要介绍 使用Retrofit并不陌生,但遇到了这种奇怪的行为,我很难理解和修复,我有两个网络服务,在Postman和iOS中都可以正常工作,但只有一个在Retrofit而不是其他工作, 在我的辩护中,我可以说我得到(未经授权)响应,这意味着我能够击中服务器并获得结果 在API开发人员的辩护中,他说它适用于Postman和其他设备,因此不是服务问题 如果有任何Retrofit专家告诉我为了得到这个错误,我背后可能会做什么改造? 技术人员 谈到服务types,它包含授权承载令牌作为标题,每6个小时到期并且根本不包含参数(所以它应该很简单,对吧?)和一个简单的URL http://hashchuna.nn-assets.com / API /位置 遗憾的是,标头令牌无法与有效密钥共享,因为它在任何人都可以尝试之前就已过期,但无论如何它都是授权承载3d44626a55dbb024725984e0d37868336fd7e48a 我做了什么 我使用okhttp拦截添加授权标头来请求使用addHeader / header方法,url中没有空格cos没有参数 在改造中获得401未经授权的错误? Java:Android:Retrofit – 使用Call但响应{code = 401,message = unauthorized} https://github.com/square/retrofit/issues/1290 但他们没有帮助 警告 现在要记住这个棘手的部分,令牌在过期时必须给出401错误,这是预期的,但问题是即使对于新创建的令牌我得到401,这是我的核心问题 LOG D/OkHttp: –> GET http://hashchuna.nn-assets.com/api/locations http/1.1 D/OkHttp: Authorization: Bearer 7c0d53de006b6de931f7d8747b22442354cecef9 D/OkHttp: –> END GET D/OkHttp: <– 401 Unauthorized http://hashchuna.nn-assets.com/api/locations (773ms) D/OkHttp: Date: Mon, 20 Feb 2017 10:44:11 […]

Android:使用Retrofit轮询服务器

我正在Android上构建一个2人游戏。 游戏顺利进行,因此玩家1等待玩家2进行输入,反之亦然。 我有一个网络服务器,我在其中使用Slim Framework运行API。 在客户端我使用Retrofit。 因此,在客户端,我想每隔X秒轮询一次我的网络服务器(我知道这不是最好的方法)来检查是否有来自玩家2的输入,如果是,则更改UI(游戏板)。 处理Retrofit我遇到了RxJava。 我的问题是弄清楚我是否需​​要使用RxJava? 如果是,是否有任何非常简单的例子用于改造轮询? (因为我只发送了几个键/值对)如果不是如何用改造来做呢? 我在这里发现了这个post,但它也没有帮助我,因为我仍然不知道我是否需要Retrofit + RxJava,是否有更简单的方法?

如何使用retofit2和RxAndroid取消请求

我正在使用Retrofit 2.0和Rx-android来加载我的API。 我在这个网站上遵循RxJava Integration with CallAdapter它运行正常。 但是,我不知道如何使用可观察对象取消加载请求。 请帮忙给我一个主意。

在改造库中禁用SSL证书检查

我在android中使用retrofit来连接服务器。 public class ApiClient { public static final String BASE_URL = “https://example.com/”; private static Retrofit retrofit = null; public static Retrofit getClient() { if (retrofit==null) { retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } return retrofit; } } 这是我的开发。 服务器,我想禁用证书检查。 我该如何在这段代码中实现? 错误:javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:找不到证书路径的信任锚。

如何知道何时完成改装调用

有没有办法知道我的改装电话何时完成了它的职责? 我喜欢知道什么时候收到所有数据,所以代码可以继续,比如开始另一个活动或者使用第一次调用的数据做一秒钟? Ps。:我正在使用异步请求(.enqueue)。 编辑: getContact(){ //Get a contact List from the server Call<List> callM = contactInterface.createRContact(listContact); callM.enqueue(new Callback<List>() { @Override public void onResponse(Response<List> response, Retrofit retrofit) { // Fetch the List from Response and save it on the local database } @Override public void onFailure(Throwable t) { Log.i(“TAG”, “Error: ” + t.getMessage()); } }); //Gets […]