2016-05-10 22 views
11

Wiele razy widziałem te pytania i próbowałem wielu rozwiązań, ale bez rozwiązania mojego problemu, próbuję wysłać jsona w żądaniu POST za pomocą modernizacji, nie jestem ekspertem w programowanie, więc mogę pominąć coś oczywistego.Wysyłanie JSON na żądanie POST z modernizacją

Moje JSON jest w ciągu znaków i wygląda na to, że:

{"id":1,"nom":"Hydrogène","slug":"hydrogene"} 

mojego interfejsu (tzw APIService.java) wygląda tak:

@POST("{TableName}/{ID}/update/0.0") 
Call<String> cl_updateData(@Path("TableName") String TableName, @Path("ID") String ID); 

A moja ClientServiceGenerator.java wygląda tak:

public class ClientServiceGenerator{ 
private static OkHttpClient httpClient = new OkHttpClient(); 

public static <S> S createService(Class<S> serviceClass, String URL) { 
    Retrofit.Builder builder = 
      new Retrofit.Builder() 
        .baseUrl(URL) 
        .addConverterFactory(GsonConverterFactory.create()); 

    Retrofit retrofit = builder.client(httpClient).build(); 
    return retrofit.create(serviceClass); 
}} 

I wreszcie oto kod w mojej działalności

APIService client = ClientServiceGenerator.createService(APIService.class, "http://mysiteexample.com/api.php/"); 
    Call<String> call = client.cl_updateData("atomes", "1"); 
    call.enqueue(new Callback<String>() { 
     @Override 
     public void onResponse(Response<String> response, Retrofit retrofit) { 
      if (response.code() == 200 && response.body() != null){ 
       Log.e("sd", "OK"); 
      }else{ 
       Log.e("Err", response.message()+" : "+response.raw().toString()); 
      } 
     } 

     @Override 
     public void onFailure(Throwable t) { 
      AlertDialog alertError = QuickToolsBox.simpleAlert(EditDataActivity.this, "updateFail", t.getMessage(), new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.cancel(); 
       } 
      }); 
      alertError.show(); 
     } 
    }); 

Powiadom mnie, jeśli potrzebujesz czegoś innego, nadzieję, że ktoś może mi pomóc.

EDIT Nie wspominając już za pierwszym razem, ale mój JSON nie zawsze będą tymi samymi klawiszami (id, nom, ślimakom).

+0

Widziałem ten post, ale wydaje się, że niektóre smary zostały usunięte i wszystko próbowałem zawiodły więc przychodzę tutaj, aby znaleźć inne rozwiązanie . – Teasel

Odpowiedz

12

Najpierw trzeba utworzyć obiekt do reprezentowania json czego potrzebujesz:

public class Data { 
    int id; 
    String nom; 
    String slug; 

    public Data(int id, String nom, String slug) { 
     this.id = id; 
     this.nom = nom; 
     this.slug = slug; 
    } 
} 

Następnie modyfikować swoje usługi, aby móc wysłać obiektu:

@POST("{TableName}/{ID}/update/0.0") 
Call<String> cl_updateData(@Path("TableName") String TableName, @Path("ID") String ID, @Body Data data); 

Wreszcie zdać ten przedmiot :

Call<String> call = client.cl_updateData("atomes", "1", new Data(1, "Hydrogène", "hydrogene")); 

UPD

Aby móc wysyłać wszelkie dane używać Object zamiast Data:

@POST("{TableName}/{ID}/update/0.0") 
Call<String> cl_updateData(@Path("TableName") String TableName, @Path("ID") String ID, 
     @Body Object data); 
+0

Co jeśli chciałbym użyć tej samej metody dla wielu żądań, bez używania tych samych typów? Chodzi mi o to, że nie mogę użyć klasy takiej jak Data bo nie wiem jak będą moje dane, to był przykład, więc nie zawsze użyję id, nom i slug. Czy można to zrobić za pomocą listy lub czegoś podobnego? – Teasel

+0

@Teasel to nie problem. Po prostu użyj 'Object' zamiast' Data' i podaj wszelkie potrzebne dane –

+0

Przepraszam, że przeszkadzam Panu, ale czy mogę mieć mały przykład? Mój mózg jest teraz w pewnym sensie palący, jak użyć do tego celu obiektu? – Teasel