2014-10-22 28 views
5

Tôi đang sử dụng Retrofit để gửi yêu cầu POST đến máy chủ của tôi:Retrofit POST với một đối tượng JSON chứa thông số

@POST("/login") 
void login(@Body User user ,Callback<User> callback); 

đâu đối tượng user của tôi chỉ có emailpassword lĩnh vực.

Kiểm tra các bản ghi, tôi có thể thấy rằng các thông số của tôi được gửi đi với định dạng này:

D/Retrofit﹕{"email":"[email protected]","password":"asdfasdf"} 

Những gì tôi cần phải làm gì để các thông số của tôi được gửi như thế này?

{"user" : {"email":"[email protected]","password":"asdfasdf"} } 
+0

tôi cũng muốn tạo ra jsonrequest tương tự bằng cách sử dụng r etrofit như bên dưới { "thông số": {"email": "[email protected]", "mật khẩu": "ni1234", "firstName": "Nilesh", "lastName": "Aher"}} Bạn có thể cho tôi một đoạn mã –

Trả lời

6

EDIT: Làm đúng cách, sử dụng một tùy chỉnh JsonSerializer:

public class CustomGsonAdapter { 
    public static class UserAdapter implements JsonSerializer<User> { 
     public JsonElement serialize(User user, Type typeOfSrc, 
            JsonSerializationContext context) { 
      Gson gson = new Gson(); 
      JsonElement je = gson.toJsonTree(user); 
      JsonObject jo = new JsonObject(); 
      jo.add("user", je); 
      return jo; 
     } 
    } 
} 

Và sau đó, trên builder Client API của bạn:

public static RestApiClient buildApiService() { 
    Gson gson = new GsonBuilder() 
      .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) 
      .registerTypeAdapter(User.class, new CustomGsonAdapter.UserAdapter()) 
      .create(); 

    RestAdapter restAdapter = new RestAdapter.Builder() 
      .setEndpoint(API_URL) 
      .setConverter(new GsonConverter(gson)) 
      .build(); 
    return restAdapter.create(MudamosApi.class); 
} 
+0

Bạn có thể vui lòng dán mã của mình nơi bạn thực sự thực hiện cuộc gọi đăng nhập không, Bạn đang chuyển sang đối tượng Người dùng như thế nào? –

+0

Hi @ Noble6, Định dạng là dòng mã cuối cùng trong nhận xét của tôi, nhưng tôi đã học đúng cách, sử dụng công cụ chuyển đổi gson tùy chỉnh https://square.github.io/retrofit/#restadapter-configuration Nhưng cảm ơn hỏi! –

+0

@KayanAlmeida Tôi đang tìm cách làm điều tương tự. Bạn có bất kỳ mã mẫu nào về cách bạn thực hiện việc này bằng trình chuyển đổi tùy chỉnh của mình không? – tvalent2

1

Phương thức đơn giản nhất để giải quyết vấn đề của bạn là tạo lớp RequestPOJO, ví dụ:

File User.java:

public class User{ 
    public String email; 
    public String password; 
} 

LoginRequestPojo.java File:

public class LoginRequestPojo{ 
    public User user; 

    public LoginRequestPojo(User user){ 
     this.user = user; 
    } 
} 

Và, trong trang bị thêm bạn 2 yêu cầu:

@POST("/login") 
void login(@Body LoginRequestPojo requestPojo, Callback<User> callback); 

Cuối cùng, cơ thể yêu cầu của bạn:

{"user":{"email":"[email protected]","password":"123123"}}

+0

Tôi đã làm điều đó trước đây, nếu bạn kiểm tra câu trả lời của tôi trước khi ấn bản tương tự như của bạn, nhưng nó không phải là cách được khuyến khích, vì nó tạo ra một 'lớp' mà hầu như không có gì. Một cách tiếp cận tốt hơn là tập trung tất cả các xử lý liên quan đến JSON bên trong một 'GsonAdapter' hoặc có thể sử dụng Jackson với chú thích! :) –

+0

Bạn không tạo ra một lớp học để giải quyết vấn đề một trong hai cách? Tại sao một lớp học phức tạp hơn để giải quyết cùng một vấn đề cách tiếp cận tốt hơn? – nasch

Các vấn đề liên quan