【问题标题】:Alaways goin in onFailure in retrofit2.0在改造 2.0 中总是进入 onFailure
【发布时间】:2018-02-20 18:44:42
【问题描述】:

我正在尝试访问 api:www.xyz.com/abc_cc/cc/userregister/newuser

这是我的代码:

    public class MainActivity extends AppCompatActivity {


    public static final String BASE_URL = "abc.com/abc_cc/cc/";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
.client(getUnsafeOkHttpClient())
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        Endpoints endpoints= retrofit.create(Endpoints.class);
        endpoints.newuser("{\"full_name\":\"sss\",\"states_id\":\"20\",\"mobile\":\"9876543210\",\"password\":\"******\",\"accept_terms\":true,\"Userid\":\"0\",\"refer\":\"\",\"ip-address\":\"1.2.3.4\",\"device_type\":\"samsung J5\",\"os-version\":\"5.0.1\",\"client\":\"app\",\"secret_key\":\"44\"}")
                .enqueue(new retrofit2.Callback<Items>() {
                    @Override
                    public void onResponse(retrofit2.Call<Items> call, retrofit2.Response<Items> response) {
                        System.out.println("onResponse : "+response.message());
                        System.out.println("onResponse : "+response.body());
                        System.out.println("onResponse : "+response.code());
                        System.out.println("onResponse : "+response.errorBody());
                        System.out.println("onResponse : "+response.isSuccessful());
                        System.out.println("onResponse : "+response.raw());
                        System.out.println("onResponse : "+response);
                    }

                    @Override
                    public void onFailure(retrofit2.Call<Items> call, Throwable t) {
                        System.out.println("onFailure"+call);

                    }
                });


    }

    public static OkHttpClient getUnsafeOkHttpClient() {

        try {
            // Create a trust manager that does not validate certificate chains
            final TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
                @Override
                public void checkClientTrusted(
                        java.security.cert.X509Certificate[] chain,
                        String authType) throws CertificateException {
                }

                @Override
                public void checkServerTrusted(
                        java.security.cert.X509Certificate[] chain,
                        String authType) throws CertificateException {
                }

                @Override
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return new java.security.cert.X509Certificate[0];
                }
            } };

            // Install the all-trusting trust manager
            final SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, trustAllCerts,
                    new java.security.SecureRandom());
            // Create an ssl socket factory with our all-trusting manager
            final SSLSocketFactory sslSocketFactory = sslContext
                    .getSocketFactory();

            OkHttpClient okHttpClient = new OkHttpClient();
            okHttpClient = okHttpClient.newBuilder()
                    .sslSocketFactory(sslSocketFactory)
                    .hostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER).build();

            return okHttpClient;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }

}

界面:

public interface Endpoints {
    @POST("/userregister/newuser")
    @FormUrlEncoded
    Call<Items> newuser(@Field("Data") String Data);

}

POJO 类:

public class Items {
    @SerializedName("Response-Status")
    @Expose
    private Boolean responseStatus;
    @SerializedName("Response-Validate")
    @Expose
    private Boolean responseValidate;
    @SerializedName("Response-Message")
    @Expose
    private String responseMessage;
    @SerializedName("Response-Data")
    @Expose
    private ResponseData responseData;

    public Boolean getResponseStatus() {
        return responseStatus;
    }

    public void setResponseStatus(Boolean responseStatus) {
        this.responseStatus = responseStatus;
    }

    public Boolean getResponseValidate() {
        return responseValidate;
    }

    public void setResponseValidate(Boolean responseValidate) {
        this.responseValidate = responseValidate;
    }

    public String getResponseMessage() {
        return responseMessage;
    }

    public void setResponseMessage(String responseMessage) {
        this.responseMessage = responseMessage;
    }

    public ResponseData getResponseData() {
        return responseData;
    }

    public void setResponseData(ResponseData responseData) {
        this.responseData = responseData;
    }

}

我收到了这样的回复:

{protocol=http/1.1, code=404, message=Not Found, url=www.xyz.com/userregister/newuser}

我已经给出了正确的网址,为什么它只占用了一半?

我已经尝试了https://code.tutsplus.com/tutorials/sending-data-with-retrofit-2-http-client-for-android--cms-27845 中的示例。此示例和示例中给出的链接工作正常,但如果我对我的 url 执行相同操作,则会收到上述错误

【问题讨论】:

  • 请参阅此帖子的已接受答案:stackoverflow.com/questions/32352159/…
  • @hsl 如果我这样做,那么它会转到 onFailure
  • 对不起,我没有仔细阅读。从 Endpoint.newuser() 定义中删除前导“/”。
  • @hsl 很抱歉我没听懂

标签: retrofit2


【解决方案1】:

我希望请检查您的解析问题可能发生。

 @Override
public void onFailure(retrofit2.Call<Items> call, Throwable t) {
 System.out.println("onFailure"+call);

//添加这个lije你有例外。

 t.printStackTrace();
 }

【讨论】:

    【解决方案2】:

    请参阅docs for Retrofit.Builder 以获得更详细的说明,但要特别注意这些位:

    基本 URL 应始终以 / 结尾。

    尾随 / 确保端点值是相对路径 将正确地将自己附加到具有路径组件的基础。

    ...

    包含前导 / 的端点值是绝对值。

    绝对值仅保留来自 baseUrl 的主机并忽略任何 指定路径组件。

    正如目前所写,在您对 Endpoints.newuser() 的调用中引用的路径是绝对路径,因此您的基本 URL 中的主机之后的路径段将被删除(因为这是记录在案的行为)。

    因此,您应该更改您的Endpoints 接口以使用相对路径,如下所示:

        public interface Endpoints {
            @POST("userregister/newuser")
            @FormUrlEncoded
            Call<Items> newuser(@Field("Data") String Data);
        }
    

    【讨论】:

    • 如果我使用它,那么它总是会进入 onFailure
    • @ParthAnjaria 你能显示在对onFailure() 的调用中传递的Throwable 的堆栈跟踪吗?
    【解决方案3】:

    为此更改您的Endpoints 界面:

    public interface Endpoints {
        @POST("userregister/newuser")
        @FormUrlEncoded
        Call<Items> newuser(@Field("Data") String Data);
    
    }
    

    请注意,我删除了尾部斜杠 /。这样,Retrofit 会将您定义的路径附加到 BASE_URL。

    【讨论】:

    • 试过这个,总是在onFailure。我通过不同的 httpurlconnection 方法尝试了相同的 url,效果很好。还有邮递员
    猜你喜欢
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多