2016-03-01 3 views
11

S'il vous plaît quelqu'un s'il vous plaît aider. Ceci est Ma méthode APIRetrofit post utilisant Firebase

@POST("/user/new.json") 
Call createUser(@Body User user); 

Ceci est mon appel à MainActivity

Retrofit retrofit=new Retrofit.Builder().baseUrl("https://XXXXXX.firebaseio.com").addConverterFactory(GsonConverterFactory.create()).build(); 

    Api api=retrofit.create(Api.class); 

    User user=new User(1,"Sam"); 

    Call<User> call=api.createUser(user); 
    call.enqueue(new Callback<User>() { 
     @Override 
     public void onResponse(Call<User> call, Response<User> response) { 
      Log.d("sam","run"); 
     } 

     @Override 
     public void onFailure(Call<User> call, Throwable t) { 
      Log.d("sam","error"); 
     } 
    }); 

C'est User.java

public class User { 

     int id; 

     String name; 

     public User(int id, String name) { 
      this.id = id; 
      this.name = name; 
     } 
    } 

sortie vient comme ça: -

"user" : {"new" : {"-KBgcQTomo8xGpnv5raM" : {"id" : 1,"name" : "Sam"}}} 

Mais je veux sortie comme ça: -

"user" : {"new" : {"id" : 1,"name" : "Sam"}} 

est ici didacticiel Retrofit + Firebase

s'il vous plaît aider ................

+0

Veuillez modifier votre API. Quelle que soit l'API que vous recevez. En outre, aucun des JSON ne semble valide. Missing '}' – Rohit5k2

+0

@Rohit pouvez-vous m'aider comment je change ..... – sushildlh

+0

interface publique Api { @POST ("/ user/new.json") Appelez createUser (@Body User user); } – sushildlh

Répondre

3

Comme @sushildlh dit que ça ne vaut pas vraiment la peine d'utiliser la retrofit dans ce cas (si on pense à la demande de send/respond timers), mais c'est une bonne pratique de programmation android. Et je suis sûr que vous devriez toujours utiliser le rétrofit.

Mais ce n'est pas le point. Votre problème est dans votre API sur Firebase. Créez votre propre fichier json avec la réponse que vous voulez obtenir et téléchargez-le sur Firebase.

Vive

6

Je ne pense pas que vous devez utiliser Retrofit pour publier des données.

Il existe Way to Saving dans Firebase. Saviez-vous que Firebase gère tout en arrière-plan lui-même.

Je ne sais pas pourquoi publiez-vous des données en utilisant Retrofit.

Extrait à envoyer et à mettre à jour automatiquement.

public class User { 
    private int birthYear; 
    private String fullName; 

    public User() {} 

    public User(String fullName, int birthYear) { 
     this.fullName = fullName; 
     this.birthYear = birthYear; 
    } 

    public long getBirthYear() { 
     return birthYear; 
    } 

    public String getFullName() { 
     return fullName; 
    } 
} 

Firebase alanRef = ref.child("users").child("alanisawesome"); 

User alan = new User("Alan Turing", 1912); 

alanRef.setValue(alan); 

Vous pouvez également enregistrer des données directement sur un emplacement de base de données:

// Référencer le nœud enfant à l'aide d'un .child() sur son nœud parent alansRef.child ("fullName") .setValue ("Alan Turing"); alansRef.child ("birthYear"). SetValue (1912);

Il sauvera comme vous le souhaitez:

{ 
    "users": { 
    "alanisawesome": { 
     "birthYear": "1912", 
     "fullName": "Alan Turing" 
    } 
    } 
} 

S'il vous plaît suivre les docs: Saving Data in Firebase

Merci.

+0

J'utilise le temps de réponse bcoz retrofit temps de retrofit est bon comparer à firebase .... de toute façon thanx pour la réponse – sushildlh

+1

Comment pouvez-vous dire? Avez-vous comparé ou simplement lu quelque part? –

+0

J'ai utilisé les premiers codes doc firebase après que je passe à la rénovation .............. – sushildlh

8

Dans Firebase, lorsque vous POST vous tentez de pousser vers un list of data stocké sous l'URL du POST. Par conséquent, il est impossible de POST à ​​/user/new.json et de ne pas stocker les données sous une nouvelle clé générée par Firebase comme "-KBgcQTomo8xGpnv5raM" sous/user/new.

Si vous souhaitez un contrôle complet de l'emplacement des données, vous devez utiliser PUT. Cependant, mettre votre nouvelle entrée directement sous/user/new n'aurait pas de sens. Où iront les entrées ultérieures?

Si vous n'acceptez pas l'affectation des touches côté serveur, la solution normale consiste à utiliser une partie de l'entrée sur laquelle vous allez appliquer l'unicité. Par exemple, le nom ou l'identifiant numérique peut être la clé du nouvel utilisateur, de sorte que plusieurs utilisateurs peuvent être ajoutés.

Basé sur l'API de mise à niveau et en utilisant le nom comme clé unique, ceci:

@POST("/user/new.json") 
Call createUser(@Body User user); 

deviendrait:

@PUT("/user/new/{name}.json") 
Call createUser(@Path("name") String name, @Body User user); 

et:

Call<User> call=api.createUser(user); 

serait alors:

Call<User> call=api.createUser(user.name, user); 

maintenant la mise en page serait:

"user" : {"new" : {"Sam": {"id" : 1,"name" : "Sam"}}} 

utilisateurs afin futurs pourraient être ajoutés tant qu'ils ne sont pas nommés Sam.

+1

Comment obtenir ce nom dans '@Path (" name ") String name' est' -KBgcQTomo8xGpnv5raM'. Il est très difficile d'identifier anonymement. Je l'ai fait avec PUT, DELETE, GET mais j'ai seulement un problème avec POST. – sushildlh

+0

@sushildlh, Si vous utilisez POST, tout ce que vous créerez aura une nouvelle feuille dans le chemin avec ce genre de hasard. Si vous utilisez PUT, vous contrôlez le chemin entier dans l'url que vous avez utilisé, mais vous devez ensuite utiliser la manipulation de chemin dans la conversion si vous voulez supporter plus d'un de quelque chose. – lossleader

+0

Merci pour votre réponse ..... Je suis à la recherche de poste ..... +1 pour vous effort – sushildlh