0

I am using Retrofit2 to connect with my API written in NodeJS.I am using MongoDB database when I am trying to post data on server it is saying

HTTP 503 service unavailable  

These are my dependencies:

implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
implementation 'io.reactivex.rxjava2:rxjava:2.2.9'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'

This is my code:

BioData.class

public class BioData {

    @SerializedName("name")
    @Expose
    private String name;

    @SerializedName("age")
    @Expose
    private String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

RetrofitClient.java

public class RetrofitClient {

    private static Retrofit retrofit = null;

    public static Retrofit getInstance(){

        if(retrofit == null)
            retrofit = new Retrofit.Builder()
                    .baseUrl("https://www.example.com/")
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .build();

        return retrofit;

         private RetrofitClient(){

        }

      }
}

ApiService.java

public interface ApiService {

    @POST("retrofitUsers")
    @FormUrlEncoded
    Observable<BioData> saveData(@Field("name") String name,
                                 @Field("age") String age);

}

MainActivity.java

public class MainActivity extends AppCompatActivity {

    EditText name,age;
    Button submit;
    ProgressBar progressBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        name = findViewById(R.id.name);
        age = findViewById(R.id.age);
        submit = findViewById(R.id.submit);
        progressBar = findViewById(R.id.progressBar);

        submit.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

              progressBar.setVisibility(View.VISIBLE);

              String str1 = name.getText().toString();
              String str2 = age.getText().toString();

              if(str1.equals("")){

                  progressBar.setVisibility(View.INVISIBLE);
                  Toast.makeText(getApplicationContext(),"Enter name",Toast.LENGTH_SHORT).show();
              }
              else if(str2.equals("")){

                  progressBar.setVisibility(View.INVISIBLE);
                  Toast.makeText(getApplicationContext(),"Enter age",Toast.LENGTH_SHORT).show();
              }
              else{

                  postData(str1,str2);
              }

            }

        });
    }

    private void postData(String str1,String str2){


        Retrofit retrofit  = RetrofitClient.getInstance();
        ApiService mapiService = retrofit.create(ApiService.class);

         mapiService.saveData(str1,str2)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .unsubscribeOn(Schedulers.io())
                 .subscribe(new Observer<BioData>() {

                     @Override
                     public void onSubscribe(Disposable d) {

                     }

                     @Override
                     public void onNext(BioData bioData) {


                     }

                     @Override
                     public void onError(Throwable e) {

                         progressBar.setVisibility(View.INVISIBLE);
                         Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
                     }

                     @Override
                     public void onComplete() {

                         progressBar.setVisibility(View.INVISIBLE);
                         Toast.makeText(getApplicationContext(), "Data inserted successfully", Toast.LENGTH_SHORT).show();
                     }
                 });
      }
}

Someone please let me know what I am doing wrong in above code.Any help would be appreciated.

THANKS

Morteza Jalambadani
  • 2,190
  • 6
  • 21
  • 35
Digvijay
  • 2,887
  • 3
  • 36
  • 86

1 Answers1

0

For your appended comment question, replace:

.addConverterFactory(GsonConverterFactory.create())

to

.addConverterFactory(GsonConverterFactory.create(new GsonBuilder().setLenient().create()))

check the explanation of lenient

fangzhzh
  • 2,172
  • 21
  • 25
  • After adding new in .create(new ...) it resolved my error but this time one new error is showing-> java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $ – Digvijay Jun 03 '19 at 19:49
  • @Digvijay my bad, what I posted just now is Kotlin code. then you might need to check Igmer Rodriguez's answer to validate your server returned json. Big chances your json is not a parsable. Mind posting your server's response josn? – fangzhzh Jun 03 '19 at 19:51
  • From server I am sending res.send("Success") after successful data post on server. – Digvijay Jun 03 '19 at 19:54
  • Then this is the case. Retrofit was trying to parse your "Success" to BioData and it failed and complained that is the wrong format. Either your server returns the saved BioData in json, or you change your saveData's response to Observable. – fangzhzh Jun 03 '19 at 19:59
  • How can I get server response like "success" message after data posted successfully on server. – Digvijay Jun 03 '19 at 20:01
  • Let us [continue this discussion in chat](https://chat.stackoverflow.com/rooms/194396/discussion-between-fangzhzh-and-digvijay). – fangzhzh Jun 03 '19 at 20:04