使用最新版本的Retrofit / OkHttp时,为什么我的Web请求会被截断

PGMacDesign

一切顺利,我最近更新了我的库并升级了Retrofit和OkHttp。我正在使用的新版本包括以下导入/版本:

1)Gson-编译'com.google.code.gson:gson:2.7'

2)OkHttp-编译'com.squareup.okhttp3:okhttp:3.4.1'

3)OkHttp日志记录-编译'com.squareup.okhttp3:logging-interceptor:3.4.1'

4)改造-编译'com.squareup.retrofit2:retrofit:2.1.0'

5)改装Gson转换器-编译'com.squareup.retrofit2:converter-gson:2.0.0-beta3'

我必须更改一些实际调用的结构,但除此之外,我的代码与这些库的先前版本(Retrofit / OkHttp 1)中的代码基本相同。

我遇到的问题是,当我发送出站呼叫时,它实际上是在“忽略”路径的注释。

我的改造客户类别:

import com.google.gson.GsonBuilder;
import com.google.gson.annotations.SerializedName;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.GsonConverterFactory;
import retrofit2.Retrofit;

public class RetrofitClient {

    private static RetrofitService serviceClient;

    private static final String BASE_URL = "api.myapiurl.com";
    private static HttpLoggingInterceptor.Level httpLogLevel = HttpLoggingInterceptor.Level.BODY;

    static {
        buildAClient();
    }

    public static RetrofitService getServiceClient(){
        return serviceClient;
    }

    private static void buildAClient(){

        Interceptor interceptor = new Interceptor() {
            @Override
            public Response intercept(Interceptor.Chain chain) throws IOException {
                Request.Builder builder = new Request.Builder();
                Request original = chain.request();
                builder.url(BASE_URL);
                builder.addHeader("Content-Type", "application/json");
                builder.method(original.method(), original.body());
                Request newRequest = builder.build();
                return chain.proceed(newRequest);
            }
        };
        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(httpLogLevel);

        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.readTimeout(60, TimeUnit.SECONDS);
        builder.writeTimeout(60, TimeUnit.SECONDS);
        builder.addInterceptor(interceptor);
        builder.addInterceptor(logging);
        builder = configureClient(builder);

        OkHttpClient client = builder.build();

        Retrofit.Builder myBuilder = new Retrofit.Builder();
        myBuilder.baseUrl(BASE_URL);
        Gson gson = new GsonBuilder()
                .setLenient()
                .setPrettyPrinting() 
                .create();
        GsonConverterFactory factory = GsonConverterFactory.create(gson);
        myBuilder.addConverterFactory(factory);
        myBuilder.client(client);
        Retrofit retrofit = myBuilder.build();
        serviceClient = retrofit.create(RetrofitService.class);

    }


    /**
     * {@link okhttp3.OkHttpClient.Builder} <-- sslSocketFactory
      */
    private static OkHttpClient.Builder configureClient(final OkHttpClient.Builder builder) {
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
                    TrustManagerFactory.getDefaultAlgorithm());
            trustManagerFactory.init((KeyStore) null);
            TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
            if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
                throw new IllegalStateException("Unexpected default trust managers:"
                        + Arrays.toString(trustManagers));
            }
            X509TrustManager trustManager = (X509TrustManager) trustManagers[0];

            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, new TrustManager[]{trustManager}, null);
            SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            builder.sslSocketFactory(sslSocketFactory, trustManager);
        return builder;
    }
}

我的改造服务界面:

public interface RetrofitService {
    //Version Strings
    public static final String VERSION2 = "/v2";

    //Returns a list of Order Objects
    @GET(VERSION2 + "/orders/{orderId}/getOrder")
    Call<Order> getOrder(@Path("orderId") String orderId,
                         @Query("key") String apiKey
    //I'm aware this is bad practice ^^, already spoke with server dev
    );

}

我正在拨打的实际外拨电话是这样的:

    public static Order getSingleOrder(String orderId, String apiKey) {

        Call<Order> call = myService.getOrder(orderId, apiKey);

        Order toReturn = null;

        try {
            Response response = call.execute();
            toReturn = (Order) response.body();
        } catch (IOException ioe){
            ioe.printStackTrace();
        }
        return toReturn;
}

尽管所有这些在过去都可以正常工作,但现在不再与更新的库一起使用。问题在于它正在“忽略”路径,因此而不是发送此调用:

获取请求:http : //api.myapiurl.com/orders/12345/getOrder? key= 54321

现在正在发出此请求:

获取请求:http : //api.myapiurl.com/

就是这样。api基本字符串中.com之后的任何内容都不会发送。我正在阅读我的logcat和后续的OkHttp日志语句,以查看调用失败的地方:

样本:

--> GET http://api.myapiurl.com/ http/1.1
--> END GET

有谁知道为什么在我更新之前一切正常,为什么会发生这种情况?

谢谢大家的帮助!

艾格林

您正在拦截器中重置网址-

            Request.Builder builder = new Request.Builder();
            Request original = chain.request();
            builder.url(BASE_URL);  <--!!! resets the request url to the base URL
            builder.addHeader("Content-Type", "application/json");
            builder.method(original.method(), original.body());
            Request newRequest = builder.build();
            return chain.proceed(newRequest);

尝试改用现有请求中的构建器-

            Request original = chain.request();
            Request.Builder builder = original.newBuilder();
            builder.addHeader("Content-Type", "application/json");
            Request newRequest = builder.build();
            return chain.proceed(newRequest);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么不使用最新版本的Bash?

如何确保我使用最新版本的bash?

React Native 医生建议升级 Android SDK 版本,但我使用的是最新版本?

Windows10升级:WindowsUpgrade9252.exe是始终使用最新版本还是下载此文件时的最新版本?

为什么需要选择最新版本的宝石?

在Postgres(最新版本)中截断日期

为什么默认情况下Perl不使用最新版本?

我的chrome版本不是最新版本,但它说的是最新版本

凌空不使在Android的最新版本请求

在CRM中请求实体的最新版本

请求最新版本的OpenGL上下文

我无法安装最新版本的 R

opensaml 的最新版本是什么?

是什么使最新版本的JVM更快?

什么是Android Volley的最新版本?

什么是新的 ?在最新版本的opencart中

尝试安装最新版本的mawk时出错

我应该配置我的服务器以使用最新版本的 PHP 吗?

在Web浏览器控件中使用Internet Explorer的最新版本

我需要使用php列出产品的唯一最新版本-mysql

如何强制PM2使用我的应用程序的最新版本?

我应该使用 rails 6.1.3.2 还是 rails 6.1.4(最新版本)?

为什么我在使用最新版本的 R 和 Rstudio 时没有任何问题?

如果使用“获取最新版本”,如何知道将更新什么?

apache-beam 使用的 jdk 最新版本是什么

在Android上使用Room时如何安装Sqlite AAR的最新版本

Angular CLI-使用最新版本时,请添加@NgModule批注

使用“时间分析器”时,BLANK仪器屏幕。最新版本的Xcode 6

使用最新版本的Firebase时出现问题