Articles of 改造

为什么Retrofit会宣传为“Type Safe”库?

我刚刚浏览了他们的主页 ,它说, 适用于Android和Java的types安全的HTTP客户端 为什么Retrofit将自己宣传为Type Safe,而其他图书馆(许多其他受欢迎的图书馆)则没有? 在你回答之前…… 这里有同样问题的答案。 它说, types安全性是编程语言阻止或防止types错误的程度。 types错误是由程序的常量,variables和方法(函数)的不同数据types之间的差异引起的错误或不期望的程序行为,例如,将整数(int)视为浮点数(浮点数)。 这在静态types语言(如Java和C)中很常见 因此,Retrofit可以防止此类错误 如果这确实是答案,那么许多库会阻止这些types的错误,但它们都没有宣传为types安全。 那是营销吗? 我认为上述答案不充分,因为types安全的定义尚未得到认真对待。 无论如何,还有另一篇关于Type Safety定义的文章 。 他们给出了例子: types安全意味着编译器将在编译时validationtypes,并在尝试将错误types分配给variables时抛出错误。 一些简单的例子: // Fails, Trying to put an integer in a string String one = 1; // Also fails. int foo = “bar”; 这也适用于方法参数,因为您将显式types传递给它们: int AddTwoNumbers(int a, int b) { return a + b; } 如果我尝试使用以下方法调用: […]

如何在Android上的Retrofit中处理可能是ARRAY或OBJECT的参数?

我遇到的问题是我正在解析的API会返回一个大小为1的ARRAY的OBJECT。 例如,有时API会响应: { “monument”: [ { “key”: 4152, “name”: “MTS – Corporate Head Office”, “categories”: {}, “address”: {} }, { “key”: 4151, “name”: “Canadian Transportation Agency”, “categories”: {}, “address”: {} }, { “key”: 4153, “name”: “Bank of Montreal Building”, “categories”: {}, “address”: {} } ], } 但是,如果monumentarrays只有1个项目,它就变成了一个OBJECT(注意缺少[]括号),如下所示: { “monument”: { “key”: 4152, “name”: “MTS – […]

使用改造2获得简单的json对象

我的api打印一个简单的json对象,如下所示: {“status”:1} 怎么说改装(v2)将它传递给gson并返回一个JSONObject包含这个键值对作为响应? 我试过以下: Call result(); 但是当在onResponse (Response response)方法中打印response.body()时,它返回{} ,这意味着它是空的。

Retrofit 2.0 – 如何获得400 Bad Request错误的响应正文?

因此,当我对我的服务器进行POST API调用时,出现了带有JSON响应的400 Bad Request错误。 { “userMessage”: “Blah”, “internalMessage”: “Bad Request blah blah”, “errorCode”: 1 } 我叫它 Call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { //AA } @Override public void onFailure(Call call, Throwable t) { //BB } } 然而问题是,一旦我得到响应,就调用onFailure()以便//调用BB。 在这里,我无法访问JSON响应。 当我记录api请求和响应时,它根本不显示JSON响应。 并且Throwable t是IOException。 然而,奇怪的是,当我在Postman上进行相同的调用时,它确实返回了400错误代码的预期JSON响应。 所以我的问题是当我收到400 Bad Request错误时如何获得json响应? 我应该向okhttpclient添加一些东西吗? 谢谢

使用Retrofit进行并行HTTP请求

我有一个Android应用程序,目前正在使用Volley库来发出网络请求并使用NetworkImageView显示下载的图像。 我想测试Retrofit的function,因为我需要运行大量请求(数千),我有点担心并行执行。 Volley使用RequestQueue处理并行请求,该RequestQueue将并发运行请求限制为4,而其他请求则排队等待执行。 在Retrofit文档中,我没有find任何方法来处理并发请求的数量,我怀疑这些细节留给了这个库中的开发人员。 它是否正确? 如果是这样,是否有任何面向android的实现/库可用? 否则,处理并行请求的最佳做法是什么?

Proguard不再适用于Retrofit

我发现较旧的问题涉及同一主题,但最新版本没有可用的答案对我有用。 我在我的项目中使用Retrofit。 当我尝试组装时,我收到以下错误: 警告:retrofit.client.OkClient:找不到引用的类com.squareup.okhttp.OkHttpClient 我正在使用以下内容,但它没有任何帮助: -keepattributes Signature -keep class retrofit.** { *; } -keep class retrofit.http.** { *; } -keep class retrofit.client.** { *; } -keep class com.squareup.okhttp.** { *; } -keep interface com.squareup.okhttp.** { *; } -keep class com.google.gson.** { *; } -keep class com.google.inject.* { *; } -keep class org.apache.http.* { *; } […]

改造:如果响应代码为401,则重定向到LoginActivity

如何从拦截器(非活动类)启动LoginActivity ? 我已经尝试了下面的代码( Interceptor )但不适合我。 拦截器 OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request newRequest = chain.request().newBuilder() .addHeader(“Authorization”, “Bearer ” + auth_token_string) .build(); Response response = chain.proceed(newRequest); Log.d(“MyApp”, “Code : “+response.code()); if (response.code() == 401){ Intent intent = new Intent(SplashActivity.getContextOfApplication(), LoginActivity.class); startActivity(intent); finish(); //Not working return response; […]

Retrofit + Okhttp取消操作不起作用

我在我的应用程序中使用这样的改造 final OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.interceptors().add(new YourInterceptor()); final OkClient okClient = new OkClient(okHttpClient); Builder restAdapterBuilder = new RestAdapter.Builder(); restAdapterBuilder.setClient(okClient).setLogLevel(LogLevel.FULL) .setEndpoint(“some url”); final RestAdapter restAdapter = restAdapterBuilder.build(); public class YourInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { // TODO Auto-generated method stub Request request = chain.request(); if (request != null) […]

OKhttp PUT示例

我的要求是使用PUT ,向服务器发送标题和正文,这将更新数据库中的内容。 我刚刚阅读了okHttp文档 ,我试图使用他们的POST示例,但它不适用于我的用例(我想这可能是因为服务器要求我使用PUT而不是POST ) 。 这是我用POST方法: public void postRequestWithHeaderAndBody(String url, String header, String jsonBody) { MediaType JSON = MediaType.parse(“application/json; charset=utf-8”); RequestBody body = RequestBody.create(JSON, jsonBody); OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(url) .post(body) .addHeader(“Authorization”, header) .build(); makeCall(client, request); } 我曾尝试使用PUT搜索okHttp示例但没有成功,如果我需要使用PUT方法,那么反正使用okHttp? 我正在使用okhttp:2.4.0(以防万一),感谢任何帮助!

在主线程上进行回调

通过以下电话: @GET(“/user/{id}/data”) void getUserData(@Path(“id”) int id, Callback cb); 回调应该在主线程上执行(如果不使用RxJava)。 我的问题是: 解析发生在哪里(让我们假设我使用XML转换器进行流程响应)。 这是主线程还是不同主线? 它取决于转换器的实现吗? 如果我必须包含一些(重)validation规则/业务规则,我是否需要在callable中生成一个新线程? 或者在Callback方法中完成它是否可以? 我正在寻找从Web服务中获取数据的方法,以避免我自己的线程管理(或使用其他方法,如IntentService等),但我也害怕使用RxJava(因为实验支持)。 还有其他建议的方法来处理这个问题吗?