Retrofit2 Silently Fails to Send 发送请求

Retrofit2 Silently Fails to Send to send Request

我正在开发一个 android 客户端来与 REST 服务器通信。我一直在使用 Retrofit 来做到这一点。到目前为止它一直工作正常,但今天我实现了一个新功能来从服务器获取用户数据列表,而 Retrofit 没有发送请求。我尝试附加一个调试器,似乎没有调用 call.enqueue 方法,而且执行似乎出于某种原因停止在上面的行上,没有错误。这是构建和排队请求的代码

public void requestMeasurementData(int userID, int startIndex, int numResults){
    FileAPI service = RetroClient.getApiService();

    RequestBody indexRB = RequestBody.create(MediaType.parse("multipart/form-data"), Integer.toString(startIndex));
    RequestBody numResultsRB = RequestBody.create(MediaType.parse("multipart/form-data"), Integer.toString(numResults));
    MultipartBody.Part indexBody = MultipartBody.Part.createFormData("start_index", null, indexRB);
    MultipartBody.Part numResultsBody = MultipartBody.Part.createFormData("num_results", null, numResultsRB);

    Call<List<Session>> sessionCall = service.getBASMIScores(userID, indexBody, numResultsBody);
    sessionCall.enqueue(new Callback<List<Session>>() {
        @Override
        public void onResponse(Call<List<Session>> call, Response<List<Session>> response) {
            if (response.isSuccessful()){
                dataReceived = true;
                sessions = response.body();
            }
            else {
                errorReceived = true;
            }
        }

        @Override
        public void onFailure(Call<List<Session>> call, Throwable t) {

        }
    });
}

调试器在调用 service.getBASMIScores 时遇到断点,但没有遇到我在下面的行中设置的断点。

这是我改造客户端的代码

private static Retrofit getRetroClient() throws KeyStoreException, CertificateException, IOException, NoSuchAlgorithmException, UnrecoverableKeyException, KeyManagementException {
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

    InputStream caFileInputStream = BASMIApplication.getRes().openRawResource(R.raw.mystore);

    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
    keyStore.load(caFileInputStream, BASMIApplication.getRes().getString(R.string.mystore_password).toCharArray());

    OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor)
            .sslSocketFactory(createAdditionalCertsSSLSocketFactory(), new AdditionalKeyStoresTrustManager(keyStore))
            .hostnameVerifier(new NullHostNameVerifier())
            .cookieJar(new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(BASMIApplication.getInstance()))).build();

    return new Retrofit.Builder()
            .baseUrl(ROOT_URL)
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
}

public static FileAPI getApiService() {
    try {
        return getRetroClient().create(FileAPI.class);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

这是我声明 Api 方法的地方

@Multipart
@GET("user/{user-id}/basmi_history")
Call<List<Session>> getBASMIScores(@Path("user-id") int user_id,
                                   @Part MultipartBody.Part startIndex,
                                   @Part MultipartBody.Part numResults);

最后这是我的会话数据 class,以防相关

public class Session {
private int id;
@SerializedName("user_id")
private int userID;
private String date;
private String time;
private float basmi;


public String getDate() {
    return date;
}

public void setDate(String date) {
    this.date = date;
}

public String getTime() {
    return time;
}

public void setTime(String time) {
    this.time = time;
}


public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public float getBasmi() {
    return basmi;
}

public void setBasmi(float basmi) {
    this.basmi = basmi;
}

public int getUserID() {
    return userID;
}

public void setUserID(int userID) {
    this.userID = userID;
}
}

这与我在我的应用程序的其他地方使用的完全相同的结构,其中改造工作正常。我不知道在这种情况下有什么不同。失败时没有报错,控制台也完全没有retrofit信息。客户端能够成功登录到服务器,但是当它到达此代码时,它会静静地失败。

有人知道这里可能出了什么问题吗?

好的,所以在深入研究调试器输出后,我设法找出了问题所在。问题在于将 @Multipart 注释与 GET 请求一起使用,它不需要请求主体。为了解决这个问题,我用 @Query 元素替换了我的请求的两个 @Part 参数,无论如何这可能是更好的做法。

我不确定为什么会抛出异常但不提供任何日志输出。