【问题标题】:Unable to post data on server using RXjava2 + Retrofit2无法使用 RXjava2 + Retrofit2 在服务器上发布数据
【发布时间】:2019-06-04 03:51:49
【问题描述】:

我正在使用 Retrofit2 连接我用 NodeJS 编写的 API。当我尝试在服务器上发布数据时,我正在使用 MongoDB 数据库

HTTP 503 service unavailable  

这些是我的依赖项:

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'

这是我的代码:

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();
                     }
                 });
      }
}

请让我知道我在上面的代码中做错了什么。任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 错误是来自服务器的 503..
  • 什么意思。
  • 你应该寻找服务器问题
  • 谢谢,我得到了修复,这是一些服务器错误。但现在我得到了这样的东西。使用 JsonReader.setLenient(true) 在第 1 行第 1 列路径 $ 处接受格式错误的 JSON
  • 你可以验证你的json here

标签: android retrofit2 rx-java2


【解决方案1】:

对于您附加的评论问题,请替换:

.addConverterFactory(GsonConverterFactory.create())

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

check the explanation of lenient

【讨论】:

  • 在 .create(new ...) 中添加新内容后,它解决了我的错误,但这次出现了一个新错误-> java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1路径 $
  • @Digvijay 我的错,我刚才发布的是 Kotlin 代码。那么您可能需要检查 Igmer Rodriguez 的答案以验证您的服务器返回的 json。很有可能您的 json 不是可解析的。介意张贴您的服务器的响应 josn 吗?
  • 在服务器上成功发布数据后,我从服务器发送 res.send("Success")。
  • 那么就是这样。 Retrofit 试图将您的“成功”解析为 BioData,但失败并抱怨格式错误。您的服务器以 json 格式返回保存的 BioData,或者您将 saveData 的响应更改为 Observable.
  • 数据成功发布到服务器后,如何获得服务器响应,如“成功”消息。
猜你喜欢
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多