2017-01-23 5 views
0

私はRuby on Railsで構築した有効なWebApiを持っています。私はこのWebAPIにエントリを持っています。@ GETリクエストで正常にリストアップしてアクセスできますが、AndroidからWebAPIに新しいエントリをPOSTできません。AndroidからRuby on RailsへのPOST retrofit2を使用したWebAPI

さらに、POSTMANというアプリケーションからWebAPIへのエントリをPOSTできます。私のWebApiインターフェイスで定義されているようにcreateCourseメソッドを呼び出そうとすると、WebApiログには呼び出しの証拠が表示されません。

リクエストが明らかに最初に送信できなかったという事実が私を混乱させますが、いずれの場合でも問題は私が私のレトロフィットPOSTと呼んでいると思います。私はthisのポスターにも同様の問題があることを認識していますが、彼のプロジェクトの構造は私とは十分に異なっています。私WEBAPIインタフェースで

は、ここで私は、アプリケーションのクラスを持って作業@GETと

私WEBAPIインターフェースでも
//CREATE 
    @Headers("Content-type: application/json") 
    @POST("/courses/create/") 
    Call<Course> createCourse(@Body Course CourseName); 
//LIST 
@GET("/courses") 
    Call<List<Course>> getCourses(); 

、私は

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

次ている機能不全@POSTであることアプリケーションを拡張し、無関係なものの中には、以下が含まれています。

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私は@GETリクエストを呼び出す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 -> { 
      }); 

のように見える、私は「アダプタ」ビットは私の質問には無関係である

public WebApi getApi() { 
    return ((App) getApplication()).getWebApi(); 
} 

を定義していますそれは私のローカルデータベースに関係しているので、うまくいきます!私は(非稼働)@POSTを呼び出す

は、それは、私が(公平を期すために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()); 

のように見えます

((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()) 
      ; 
)私の代わりに鋳造後のAppクラスに1つのネイティブを使用してのここで私の他の場所で定義されたgetWebApi()メソッドを使用する必要がありますが、結果は同じです

私はこの呼び出しがうまく動作しない場所だと思います。たぶん、どのように改造が動作するのか分からないかもしれませんが、JSONとしてオブジェクトを送信する方法を考えました。私はこれが本当であるかどうか、それを確認する方法、または最初に私のAPIにPOST要求が送信されていないように見える理由がわかりません(GETのようにログには表示されません)

+0

アプリがクラッシュしますか?コールは例外をスローしますか?私はRetrofit.Builder()が表示されません。addCallAdapterFactory(RxJavaCallAdapterFactory.create()) –

+0

addCallAdapterFactory行を追加しようとします。つまり、アプリはクラッシュしたり、目に見える例外をスローしたりすることはありません。コールが決して行われなかったり、コールが有効であるように動作しますが、WebApiには決して到着しません。 –

+0

retrofit2.Retrofitとretrofit2.converter.gson.GsonConverterFactoryをインポートしてretrofit2。*を試みましたが、RxJavaCallAdapterFactoryが認識されません –

答えて

0

あなたはObservableを購読しないので、決して評価されません。また、RxJavaを使用する予定がある場合は、WebApiインターフェイスの作成方法が間違っています。

まず、これまでお使いのWEBAPIインターフェイスを変更します。

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

あなたがgetCoursesを呼び出すときだから今、あなたが観察を得ようとしています。

第二に、このようなあなたのメソッドを呼び出します。

(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"は、retrofit2レスポンスの代わりにCourseクラスのオブジェクトのように機能しますどのようなアイデアですか? –

+0

RetrofitはすでにResponseBody.body()を呼び出す必要はなく、 "body()"を呼び出す必要はありません。 Gsonを使用しています。Retrofitがあなたに返すと、Courseオブジェクトが得られます。 右?? onNext(コースコース)メソッドでこのオブジェクトを処理するだけです。私はあなたが地図機能を必要としているとは思わない...私は私の答えのそれを削除 –

+0

あなたは絶対に正しいです。最初はRxJavaCallAdapterFactoryを使うつもりはなかったので、私は何をすべきかを知らなかった。本当にありがとう。将来これを参照したい人は、この答えで 'RespostaInsereImagem'が' WebApi.Course'に置き換えられることを知ってください。乾杯! –

関連する問題