【问题标题】:Getting the returned object in retrofit and rxjava在改造和 rxjava 中获取返回的对象
【发布时间】:2017-10-11 22:14:51
【问题描述】:

我将在我的应用程序中使用 rxjava 和改造。我正在处理的事情是:我在我的 POST API 上使用这种 json 格式将数据发送到服务器:

{
    "user":{
        "email":"0665587777",
        "password":"password",
        "password_confirmation":"password",
        "user_type":"patient"
    },
    "profile":{
        "first_name":"David",
        "lastname":"Jackson bil",
        "gender":"Male",
        "national_id":"22111"
    }
}

并获取此json格式以从服务器获取数据:

{
  "id": 37,
  "email": "0665587777",
  "created_at": "2017-05-12T13:11:58.278Z",
  "updated_at": "2017-05-12T13:11:58.278Z",
  "enabled": false,
  "admin": false,
  "user_type": "patient",
  "googletoken": null
}

为此,我创建了一个名为 register 的对象并像这样实现:

public class register {
    @SerializedName("user")
    User user=new User();
    @SerializedName("profile")
    patient patient=new patient();
}

我在我的界面中这样设置 API 调用:

 @POST("api/users")
        //Call<SOAnswersResponse> getAnswer();
    Observable<register> CreateUser(@Body register user);

并像这样实现改造客户端:

public class RetrofitClient {
    private static Retrofit retrofit=null;
    public static Retrofit getClient(String baseUrl){
        if(retrofit==null){
            retrofit=new Retrofit.Builder()
                    .baseUrl(baseUrl)
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

这就是我在活动中所做的一切:

public class CreateUser extends AppCompatActivity {
    private SOService mService;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_create_user);

        mService= ApiUtils.getSOService();
        loadAnwser();
    }
    private void loadAnwser() {

        Observer<register> myObserver= new Observer<register>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {

            }

            @Override
            public void onNext(@NonNull register register) {
               User user=register.getUser();
               Log.d("Retroit_Result",user.toString());
            }

            @Override
            public void onError(@NonNull Throwable e) {
               Log.d("Retroit_Result","Error"+e.getMessage());
            }

            @Override
            public void onComplete() {

            }
        };
        mService=ApiUtils.getSOService();
        User user=new User();
        patient patient=new patient();
        register reg=new register();

        patient.setFirst_name("Hussssein");
        patient.setLast_name("Ojaaaghi");
        user.setEmail("55662266");
        patient.setGender("Male");
        patient.setNational_id("123222322");
        user.setPassword("password");
        user.setPassword_confirmation("password");
        user.setUser_type("patient");
        reg.setPatient(patient);
        reg.setUser(user);
        mService.CreateUser(reg)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(myObserver);
    }
}

现在的问题是我在 onNext 方法中得到了 null?

【问题讨论】:

    标签: android json retrofit rx-java rx-android


    【解决方案1】:

    您正在发布一个注册对象,但也期望 API 调用返回一个注册对象,例如

    Observable<register> CreateUser(@Body register user);
    

    但是您期望的 JSON sn-p 不是寄存器类型

    { “身份证”:37, “电子邮件”:“0665587777”, "created_at": "2017-05-12T13:11:58.278Z", "updated_at": "2017-05-12T13:11:58.278Z", “启用”:假, “管理员”:假, "user_type": "病人", “谷歌令牌”:空 }

    您需要创建一个表示此数据的新响应对象并更改返回类型,例如

    Observable<RegisterResponse> CreateUser(@Body register user);
    

    【讨论】:

    • 那么我应该在 loadAnwser 方法上做什么,我之前做过,但真正的问题是 loadAnwser 方法,我不知道如何声明 observable 并在那里订阅
    • 所以在 loadAnswer 中,您的订阅者将像这样开始: Observer myObserver= new Observer() { 即在所有地方或任何您称之为响应类的地方将注册更改为 RegisterResponse
    【解决方案2】:
    public class register {
        @SerializedName("user")
        User user=new User();
        @SerializedName("profile")
        patient patient=new patient();
    }
    

    不要像这样实例化对象,Gson 适配器会为你做这件事

    Instad 你的模型类应该是这样的

    public class register {
    
            @SerializedName("user")
            User user;
    
            @SerializedName("profile")
            patient patient;
    
            public User getUser() {
                return this.user;
            }
    
            public patient getpatient() {
                return this.patient;
            }
        }
    

    如果您想手动创建 register 类的对象,请创建满足您需求的构造函数

    附注,请尝试关注java naming convention,这样您的代码将更具可读性

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-29
      • 2018-01-22
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      相关资源
      最近更新 更多