Sending JSON in POST request with Retrofit2

后端 未结 4 1423
既然无缘
既然无缘 2020-12-03 11:24

I\'m using Retrofit to integrate my Web services and I do not understand how to send a JSON object to the server using a POST request. I\'m currently stuck, here is my code:

相关标签:
4条回答
  • 2020-12-03 11:56

    Use these in gradle

    compile 'com.squareup.retrofit2:retrofit:2.3.0'
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'
    compile 'com.squareup.retrofit2:converter-scalars:2.3.0'
    

    Use these two POJO class ........

    LoginData.class

    public class LoginData {
    
        private String email;
        private String password;
    
        public LoginData(String email, String password) {
            this.email = email;
            this.password = password;
        }
    
        /**
         *
         * @return
         * The email
         */
        public String getEmail() {
            return email;
        }
    
        /**
         *
         * @param email
         * The email
         */
        public void setEmail(String email) {
            this.email = email;
        }
    
        /**
         *
         * @return
         * The password
         */
        public String getPassword() {
            return password;
        }
    
        /**
         *
         * @param password
         * The password
         */
        public void setPassword(String password) {
            this.password = password;
        }
    
    }
    

    LoginResult.class

    public class LoginResult {
    
        private Boolean error;
        private String message;
        private Integer doctorid;
        private Boolean active;
    
        /**
         *
         * @return
         * The error
         */
        public Boolean getError() {
            return error;
        }
    
        /**
         *
         * @param error
         * The error
         */
        public void setError(Boolean error) {
            this.error = error;
        }
    
        /**
         *
         * @return
         * The message
         */
        public String getMessage() {
            return message;
        }
    
        /**
         *
         * @param message
         * The message
         */
        public void setMessage(String message) {
            this.message = message;
        }
    
        /**
         *
         * @return
         * The doctorid
         */
        public Integer getDoctorid() {
            return doctorid;
        }
    
        /**
         *
         * @param doctorid
         * The doctorid
         */
        public void setDoctorid(Integer doctorid) {
            this.doctorid = doctorid;
        }
    
        /**
         *
         * @return
         * The active
         */
        public Boolean getActive() {
            return active;
        }
    
        /**
         *
         * @param active
         * The active
         */
        public void setActive(Boolean active) {
            this.active = active;
        }
    
    }
    

    Use API like this

    public interface RetrofitInterface {
         @POST("User/DoctorLogin")
            Call<LoginResult> getStringScalar(@Body LoginData body);
    }
    

    use call like this ....

    Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("Your domain URL here")
                .addConverterFactory(ScalarsConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    
           RetrofitInterface service = retrofit.create(RetrofitInterface .class);
    
     Call<LoginResult> call=service.getStringScalar(new LoginData(email,password));
        call.enqueue(new Callback<LoginResult>() {
                    @Override
                    public void onResponse(Call<LoginResult> call, Response<LoginResult> response) { 
                   //response.body() have your LoginResult fields and methods  (example you have to access error then try like this response.body().getError() )
    
                  }
    
                    @Override
                    public void onFailure(Call<LoginResult> call, Throwable t) {
               //for getting error in network put here Toast, so get the error on network 
                    }
                });
    

    EDIT:-

    put this inside the success() ....

    if(response.body().getError()){
       Toast.makeText(getBaseContext(),response.body().getMessage(),Toast.LENGTH_SHORT).show();
    
    
    }else {
              //response.body() have your LoginResult fields and methods  (example you have to access error then try like this response.body().getError() )
                    String msg = response.body().getMessage();
                    int docId = response.body().getDoctorid();
                    boolean error = response.body().getError();  
    
                    boolean activie = response.body().getActive()();   
    }
    

    Note :- Always use POJO classes , it remove the JSON data parsing in the retrofit .

    0 讨论(0)
  • 2020-12-03 12:01

    i think you should now create a service generator class and after that you should use Call to call your service

    PostInterface postInterface = ServiceGenerator.createService(PostInterface.class);
    Call<responseBody> responseCall =
                postInterface.getStringScalar(requestBody);
    

    then you can use this for synchronous request and get the body of response:

    responseCall.execute().body();
    

    and for asynchronous :

    responseCall.enqueue(Callback);
    

    refer to link provided below for complete walkthrough and how to create ServiceGenerator :

    https://futurestud.io/tutorials/retrofit-getting-started-and-android-client

    0 讨论(0)
  • 2020-12-03 12:11

    This way works for me

    My web service

    Add this in your gradle

    compile 'com.squareup.retrofit2:retrofit:2.3.0'
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'
    compile 'com.squareup.retrofit2:converter-scalars:2.3.0'
    

    Interface

    public interface ApiInterface {
    
        String ENDPOINT = "http://10.157.102.22/rest/";
    
        @Headers("Content-Type: application/json")
        @POST("login")
        Call<User> getUser(@Body String body);
    
    }
    

    Activity

       public class SampleActivity extends AppCompatActivity implements Callback<User> {
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_sample);
    
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(ApiInterface.ENDPOINT)
                    .addConverterFactory(ScalarsConverterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
    
            ApiInterface apiInterface = retrofit.create(ApiInterface.class);
    
    
            // prepare call in Retrofit 2.0
            try {
                JSONObject paramObject = new JSONObject();
                paramObject.put("email", "sample@gmail.com");
                paramObject.put("pass", "4384984938943");
    
                Call<User> userCall = apiInterface.getUser(paramObject.toString());
                userCall.enqueue(this);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    
    
        @Override
        public void onResponse(Call<User> call, Response<User> response) {
        }
    
        @Override
        public void onFailure(Call<User> call, Throwable t) {
        }
    }
    
    0 讨论(0)
  • 2020-12-03 12:12

    From Retrofit 2+ use POJO objects rather than a JSON Object for sending requests with @Body annotations. With JSON object being sent the request fields are set to their default value than what has been sent from the app on backend. This won't be the case with POJO objects.

    0 讨论(0)
提交回复
热议问题