2017-09-04 4 views
0

TL; DR


Nouveau pour rénover il est donc probablement une erreur noob. Endpoint fonctionne bien dans le facteur et je reçois Response{protocol=http/1.1, code=200, message=OK, url=http://192.168.1.249/api/v1/user/1} dans la réponse, mais aucune donnée liée à l'utilisateur.Rénovation 2 - Obtenir 200 réponse mais pas obtenir les données renvoyées

Le problème


J'ai construit une API REST en utilisant Laravel que je veux accéder à des périphériques. Il y aura beaucoup de points de terminaison qui doivent être accédés mais je ne peux pas obtenir n'importe lequel d'entre eux pour fonctionner. J'essaie d'en faire un avant d'ajouter le reste, mais même si je reçois un 200 je ne reçois aucune donnée.

Toutes les propriétés sont présentes sur le corps de la réponse, mais elles sont toutes nulles.

Le code


MainActivity.java

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Toast; 


import com.x.tools.actualrest.rest.User; 
import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 

import java.util.ArrayList; 
import java.util.List; 

import okhttp3.ResponseBody; 
import retrofit2.Call; 
import retrofit2.Callback; 
import retrofit2.Response; 
import retrofit2.Retrofit; 
import retrofit2.converter.gson.GsonConverterFactory; 

public class MainActivity extends Activity { 

    private CdenApi cdenAPI; 

    private String token; 

    String requested_with = "XMLHttpRequest"; 
    String content_type = "application/json"; 

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

     createCdenAPI(); 

     cdenAPI.getUser(requested_with, content_type, "1").enqueue(userCallback); 


    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
    } 

    private void createCdenAPI() { 
     Gson gson = new GsonBuilder() 
       .setDateFormat("yyyy-MM-dd HH:mm:ss") 
       .create(); 

     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(CdenApi.BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create(gson)) 
       .build(); 

     cdenAPI = retrofit.create(CdenApi.class); 
    } 

    Callback<User> userCallback = new Callback<User>() { 
     @Override 
     public void onResponse(Call<User> call, Response<User> response) { 
      if (response.isSuccessful()) { 
       User data = new User(); 
       data = response.body(); 
      } else { 

      } 
     } 

     @Override 
     public void onFailure(Call<User> call, Throwable t) { 
      t.printStackTrace(); 
     } 
    }; 
} 

CdenApi.java

import com.x.tools.actualrest.rest.User; 

import retrofit2.http.GET; 
import retrofit2.http.Header; 
import retrofit2.http.Path; 
import retrofit2.Call; 

public interface CdenApi { 

    String BASE_URL = "http://192.168.1.249/api/v1/"; 

    @GET("user/{id}") 
    Call<User> getUser(@Header("X-Requested-With") String req_with, @Header("Content-Type") String cont_type, @Path("id")String userId); 

} 

User.java

import com.google.gson.annotations.SerializedName; 

public class User { 

    @SerializedName("id") 
    public Integer id; 
    @SerializedName("name") 
    public String name; 
    @SerializedName("email") 
    public String email; 
    @SerializedName("access_level") 
    public Integer accessLevel; 
    @SerializedName("created_at") 
    public String createdAt; 
    @SerializedName("updated_at") 
    public String updatedAt; 
    @SerializedName("view_boxes") 
    public ViewBoxes viewBoxes; 

} 

UserResult.java

import com.google.gson.annotations.SerializedName; 

public class UserResult { 

    @SerializedName("msg") 
    public String msg; 
    @SerializedName("user") 
    public User user; 

} 

ViewBoxes.java

import com.google.gson.annotations.SerializedName; 

public class ViewBoxes { 

    @SerializedName("href") 
    public String href; 
    @SerializedName("method") 
    public String method; 

} 

JSON de point final:

{ 
    "msg": "User information", 
    "user": { 
     "id": 1, 
     "name": "Guy", 
     "email": "[email protected]", 
     "access_level": 1, 
     "created_at": "2017-08-22 15:53:06", 
     "updated_at": "2017-08-22 15:53:06", 
     "view_boxes": { 
      "href": "api/v1/user/1", 
      "method": "GET" 
     } 
    } 
} 

La solution


J'ai besoin de savoir où je vais faux. Je suis novice en matière de modernisation, et je suis certain que j'ai mis en œuvre quelque chose de mal, mais je ne vois pas le problème.

Merci d'avance pour toute aide.

+0

Le rappel de l'utilisateur beign est-il appelé? avez-vous une erreur dans la trace de la pile? avez-vous la permission d'Internet dans votre manifeste? –

+0

Il est appelé, et non je ne reçois aucune erreur – mtrueblood

+0

Vous pourriez mettre un "point d'arrêt" (https://developer.android.com/studio/debug/index.html#breakPoints) pour voir ce qui se passe ou vous peut imprimer un journal, vérifiez qu'il ne va pas à la condition else qui est vide. –

Répondre

4

Je pense que le problème est que vous avez Call<User>, mais comme pour votre JSON vous obtenez UserResult dans la réponse du serveur, donc au lieu il doit être Call<UserResult> et userCallback même, au lieu de

Callback<User> userCallback = new Callback<User> 

il doit être

Callback<UserResult> userCallback = new Callback<UserResult> 

et la même dans la réponse

public void onResponse(Call<UserResult> call, Response<UserResult> response) { 
      if (response.isSuccessful()) { 
       User data = new User(); 
       data = response.body().user; 
      } else { 

      } 
     } 
1

Essayez de faire cette

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

    createCdenAPI(); 
    Response<User> response = cdenAPI.getUser(requested_with, content_type, "1").execute(); 

    User user = response.body(); 
} 
+0

Je ne suis pas assez familier avec le filetage pour implémenter ceci. Quelle classe devrait mettre en œuvre runnable? – mtrueblood

+0

Je ne pense pas que vous ayez besoin d'utiliser Runnable si vous utilisez une conversion. –

+0

Retrofit gère le filetage et la mise en cache pour vous! –