我有一個通過Ruby on Rails構建的有效WebApi。我有這個WebAPI中的條目我能夠用@GET請求成功列出和訪問,但我無法將新條目從Android發佈到WebAPI。另外,我可以從一個名爲POSTMAN的應用程序向WebAPI發佈條目,當我嘗試調用我的WebApi界面中定義的createCourse方法時,我的WebApi日誌顯示沒有證據表明正在進行調用。從Android到Ruby on Rails WebAPI POST with retrofit2
事實上,請求顯然無法發送在第一個地方混淆了我,但無論如何我想象的問題是我打電話給我的改造POST。我知道this海報有類似的問題,但他的項目結構與我的不同,我不知道它是如何適用的。
在我的WebAPI接口,這裏的工作@GET和功能失調@POST
//CREATE
@Headers("Content-type: application/json")
@POST("/courses/create/")
Call<Course> createCourse(@Body Course CourseName);
//LIST
@GET("/courses")
Call<List<Course>> getCourses();
而且在我的WebAPI界面,我有以下
public static class Course {
public void setName(String name) {
this.name = name;
}
public void setLocation(String location) {
this.location = location;
}
public void setStartDate(String startDate) {
this.startDate = startDate;
}
public void setEndDate(String endDate) {
this.endDate = endDate;
}
@SerializedName("name") private String name;
@SerializedName("location") private String location;
@SerializedName("startDate") private String startDate;
@SerializedName("endDate") private String endDate;
public String getName() {
return name;
}
public String getLocation() {
return location;
}
public String getStartDate() {
return startDate;
}
public String getEndDate() {
return endDate;
}
}
我有一個應用程序類擴展應用程序,並在無關的東西之間,它包含以下內容
public WebApi getWebApi() {
if (webApi == null) {
webApi = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("https://validurl.com") //i plug in something valid in implementation
.build()
.create(WebApi.class);
}
return webApi;
}
在acti VITY,我叫@ GET請求時,它看起來像這樣
Observable.just(getApi().getCourses())
.subscribeOn(Schedulers.io())
.map(x -> {
try {
return x.execute();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
})
.map(x -> x.body())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(x -> {
adapter.updateCourses(x);
}, ex -> {
});
在我所說的@GET活動
,我已經定義
public WebApi getApi() {
return ((App) getApplication()).getWebApi();
}
「適配器」位無關,我的問題因爲它與我的本地數據庫有關 - 它工作正常!
我在哪裏調用(非工作)@POST,它看起來像這樣
WebApi.Course onlinecourse = new WebApi.Course();
onlinecourse.setName(localcourse.name());
onlinecourse.setLocation(localcourse.location());
onlinecourse.setStartDate(localcourse.start_date());
onlinecourse.setEndDate(localcourse.end_date());
這樣做之後,我用下面的(沒有工作)的一個嘗試和發送POST(說句公道話,我應該在這裏用我的別處定義getWebApi()方法,而不是使用一個原生應用程序類轉換後的,但結果是一樣的)
((App) getApplication()).getWebApi().createCourse(onlinecourse);
OR
Observable.just(((App) getApplication()).getWebApi().createCourse(onlinecourse))
.subscribeOn(Schedulers.io())
.map(x -> {
try {
return x.execute();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
})
.map(x -> x.body())
.observeOn(AndroidSchedulers.mainThread())
;
我想這個電話是事情不工作的地方。也許我不瞭解改造是如何工作的,但我認爲我擁有它的方式將對象作爲JSON發送。我不確定這是否屬實,我如何檢查,或者爲什麼看起來沒有POST請求首先發送到我的API(它不會在GET日誌中出現在日誌中)
你的應用崩潰了嗎?通話是否會引發異常?我沒有看到Retrofit.Builder()。addCallAdapterFactory(RxJavaCallAdapterFactory.create()) –
我會嘗試添加addCallAdapterFactory行。現在,應用程序既不會崩潰也不會拋出任何可見的異常......它的行爲就好像從來沒有進行過調用或調用是有效的,但它永遠不會到達我的WebApi。 –
我已經導入了retrofit2.Retrofit和retrofit2.converter.gson.GsonConverterFactory,並嘗試了retrofit2。*,但RxJavaCallAdapterFactory未被識別 –