2017-09-12 6 views
0

Je suis en train de frapper la api: www.xyz.com/abc_cc/cc/userregister/newuseralaways goin à onFailure dans retrofit2.0

Ceci est mon code:

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\":\"\",\"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); 
     } 

    } 

} 

Interface:

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

} 

classe 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; 
    } 

} 

Je reçois cette réponse:

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

J'ai donné le bon URL alors pourquoi n'en prend-il que la moitié?

J'ai essayé l'exemple de https://code.tutsplus.com/tutorials/sending-data-with-retrofit-2-http-client-for-android--cms-27845. Cet exemple et le lien donné dans l'exemple fonctionnent très bien, mais si je fais la même chose avec mon URL alors je reçois l'erreur ci-dessus

+0

se référer à la réponse acceptée pour cet article: https: // stackoverflow.com/questions/32352159/retrofit-2-supprime-caractères-après-hostname-from-base-url – hsl

+0

@ hsl si je fais cela alors il va à onFailure –

+0

désolé, je n'ai pas lu assez attentivement. supprimer le "/" principal de votre définition Endpoint.newuser(). – hsl

Répondre

2

J'espère bien vouloir vérifier vos problèmes de l'analyse syntaxique produite.

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

// ajouter cette lije vous avez des exceptions.

t.printStackTrace(); 
} 
0

Modifier votre interface Endpoints pour cela:

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

} 

Notez que j'ai enlevé la barre oblique finale /. De cette manière, Retrofit ajoute le chemin que vous avez défini à BASE_URL.

+0

essayé, toujours aller surFailure. Et j'ai essayé la même URL via la méthode httpurlconnection différente, qui fonctionne très bien. Et aussi dans le facteur –

0

se réfèrent à la docs for Retrofit.Builder pour une explication plus détaillée, mais une attention particulière à ces bits:

URL de base doivent toujours se terminer /.

Un suivi/garantit que les valeurs des points d'extrémité qui sont des chemins relatifs s'ajouteront correctement à une base qui a des composants de chemin.

...

valeurs de point de terminaison qui contiennent un premier/sont absolues.

Les valeurs absolues ne conservent que l'hôte de baseUrl et ignorent les composants de chemin spécifiés .

comme actuellement écrite, le chemin référencé dans votre appel à Endpoints.newuser() est absolue, et par conséquent les segments de chemin après l'hôte dans l'URL de votre base sont sautées (comme cela est le comportement documenté).

donc, vous devriez changer votre lieu d'utiliser l'interface des chemins relatifs Endpoints, comme ceci:

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

si j'utilise ceci alors il ira toujours dans onFailure –

+0

@ParthAnjaria pouvez-vous montrer la trace de pile de 'Throwable' passé dans l'appel à' onFailure() '? – hsl