2017-01-23 85 views
0

我有一個通過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日誌中出現在日誌中)

+0

你的應用崩潰了嗎?通話是否會引發異常?我沒有看到Retrofit.Builder()。addCallAdapterFactory(RxJavaCallAdapterFactory.create()) –

+0

我會嘗試添加addCallAdapterFactory行。現在,應用程序既不會崩潰也不會拋出任何可見的異常......它的行爲就好像從來沒有進行過調用或調用是有效的,但它永遠不會到達我的WebApi。 –

+0

我已經導入了retrofit2.Retrofit和retrofit2.converter.gson.GsonConverterFactory,並嘗試了retrofit2。*,但RxJavaCallAdapterFactory未被識別 –

回答

0

你永遠不會訂閱你的Observable,所以它永遠不會被評估。另外,如果你打算使用RxJava,你創建WebApi接口的方式是錯誤的。所以,現在

//CREATE 
    @Headers("Content-type: application/json") 
    @POST("/courses/create/") 
    Observable<Course> createCourse(@Body Course CourseName); 
//LIST 
@GET("/courses") 
    Observable<List<Course>> getCourses(); 

,當你打電話,你會得到一個可觀察getCourses:

首先,你的WebAPI界面改變了這一點。

其次,打電話給你的方法是這樣的:

(App) getApplication()).getWebApi() 
       .createCourse(onlinecourse)) 
       .subscribeOn(Schedulers.io())   
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Observer<Course>() { 
       @Override 
       public void onCompleted() { 
        //Code here 
       } 

      @Override 
      public void onError(Throwable e) { 
        //Code here 
      } 

      @Override 
      public void onNext(Course course) { 
        //Code here - Do something with course! 

      } 

這將您的工作。 快樂編碼!

+0

我不知道足以解釋爲什麼,但這是行不通的。將Call調用到Observable後,我試圖在'.map(x - > x.body())中使用的「x」像Course類的對象,而不是retrofit2響應所以我不能調用類似「body()」的retrofit2方法任何想法? –

+0

你不需要調用ResponseBody.body()或調用「body()」。你的Retrofit已經爲你解析了Json對象使用Gson。當Retrofit將它返回給你時,它會給你一個Course對象,這就是你需要的 對??你所要做的就是在onNext(Course course)方法中處理這個對象。我不認爲你需要地圖功能...所以我刪除了我的答案 –

+0

你是絕對正確的。我只是不知道我應該做什麼改變,因爲我最初並沒有計劃使用RxJavaCallAdapterFactory。非常感謝。對於任何想要在將來提及此事的人,請在此答案中知道「RespostaInsereImagem」將被替換爲「WebApi.Course」。乾杯! –