2017-09-26 5 views
0

Retrofitを使用してRetrofit 2.1.0を使用するのは初めてです。 私は200 OKを返すが、私のcall.enqueueはいつもonFailure()を実行し、論理的にはonResponse()を実行しなければならない。私は本当になぜ知りませんし、同じ問題を検索しますが、その説明は私の問題を解決しません。誰かが私の日を救うことができます...?Retrofit 2.1.0 onFailure()が呼び出されている間に呼び出されます。200 OK

私はこれは私がここで私の活動に

Call<Result<Meeting>> call = mClient.createMeeting(meeting.getName(), meeting.getDate_start(), meeting.getDate_ended(), 
      meeting.getLocation(), meeting.getLatitude(), meeting.getLongitude(), meeting.getPoints(), meeting.getMember_ids()); 
    Log.e("URL",String.valueOf(call.request().hashCode())); 
    call.enqueue(new Callback<Result<Meeting>>() { 
     @Override 
     public void onResponse(Call<Result<Meeting>> call, Response<Result<Meeting>> response) { 
      Log.e("Response Code", String.valueOf(response.code())); 
      if (response.isSuccessful()) { 
       Log.e("Meeting ", "Dibuat"); 
       Toast.makeText(getApplicationContext(), "Meeting Created", Toast.LENGTH_SHORT).show(); 
       Intent i = new Intent(mContext, MainActivity.class); 
       mContext.startActivity(i); 
       ((Activity) mContext).finish(); 
      } else { 
       Toast.makeText(getApplicationContext(), "Create Meeting Failed", Toast.LENGTH_SHORT).show(); 
       Toast.makeText(getApplicationContext(), "Response Error: HTTP Code " + String.valueOf(response.code()), 
         Toast.LENGTH_SHORT).show(); 
       Log.e(TAG + "onResponse", String.valueOf(response.raw().toString())); 
      } 
     } 
     @Override 
     public void onFailure(Call<Result<Meeting>> call, Throwable t) { 
      Log.e("On Failure", "Working"); 

     } 
    }); 

を実行する方法です

@FormUrlEncoded 
@POST("/api/v1/meetups/") 
Call<Result<Meeting>> createMeeting(@Field("name") String name, 
            @Field("date_start") String date_start, 
            @Field("date_ended") String date_ended, 
            @Field("location") String location, 
            @Field("latitude") Double latitude, 
            @Field("longitude") Double longitude, 
            @Field("points") Integer points, 
            @Field("member_ids") String member_ids); 

APIと私のDBへのPOSTを持っているが、私の会議のモデルである

public class Meeting { 
private String _id; 
private String name; 
private String date_start; 
private String date_ended; 
private String status; 
private String location; 
private String member_ids; 
private Double latitude; 
private Double longitude; 
private Integer points; 
private Group group; 
private Map<String, Object> additionalProperties = new HashMap<String, Object>(); 

public String get_id() { 
    return _id; 
} 

public void set_id(String _id) { 
    this._id = _id; 
} 

public String getName() { 
    return name; 
} 

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

問題があります意図的に会議に間違った属性を入力すると、エラーコード500が返され、onResponse()が機能しています。response.isSuccessful() == falseおよびLog.e()の出力が「ミーティングの作成に失敗しました」です。しかし、私は右の属性を入力すると、それは私のDBに200 OK、POSTを与えますが、onFailure()が働いていて、Log.e() "失敗した場合:動作中"を実行します。あなたを助けるかもしれ

+0

Result<List<Meeting>>にを変更する必要が

Call<Result<List<Meeting>>> call = mClient.createMeeting(meeting.getName(), meeting.getDate_start(), meeting.getDate_ended(), meeting.getLocation(), meeting.getLatitude(), meeting.getLongitude(), meeting.getPoints(), meeting.getMember_ids()); call.enqueue(new Callback<Result<List<Meeting>>>() { @Override public void onResponse(Call<Result<List<Meeting>>> call, Response<Result<List<Meeting>>> response) { if (response.isSuccessful()) { Toast.makeText(getApplicationContext(), "Meeting Dibuat", Toast.LENGTH_SHORT).show(); Intent i = new Intent(mContext, MainActivity.class); mContext.startActivity(i); ((Activity) mContext).finish(); } else { Toast.makeText(getApplicationContext(), "Membuat Meeting Gagal", Toast.LENGTH_SHORT).show(); Toast.makeText(getApplicationContext(), "Response Error: HTTP Code " + String.valueOf(response.code()), Toast.LENGTH_SHORT).show(); Log.e(TAG + "onResponse", String.valueOf(response.raw().toString())); } } @Override public void onFailure(Call<Result<List<Meeting>>> call, Throwable t) { Log.e("On Failure", t.getMessage()); } }); 

注:このようなあなたの電話を使用することができます

@FormUrlEncoded @POST("/api/v1/meetups/") Call<Result<List<Meeting>>> createMeeting(@Field("name") String name, @Field("date_start") String date_start, @Field("date_ended") String date_ended, @Field("location") String location, @Field("latitude") Double latitude, @Field("longitude") Double longitude, @Field("points") Integer points, @Field("member_ids") String member_ids); 

2xx..3xx'。あなたの場合、これは偽と評価されるので、私は状態コードが何であるか不思議です。 さらに、後続の 'response.message()'は何を示していますか? – sschrass

+0

@sschrass 'onFailure()'で 'Log.e(" On Failure "、t.getMessage());でメッセージを取得するコードを編集し、' On Failure:java.lang.IllegalStateException: BEGIN_OBJECTは期待されていましたが、3行目の12行目のBEGIN_ARRAYでした。path $ .data' –

+0

解析やデータのバインド中にJsonArrayを使用しています。 – YoLo

答えて

0

これらの手順:サーバーからの応答JSON構造アウト

  • 図。郵便配達またはカールを使用してこれを試すことができます。

    { 
        "success": true, 
        "data": [ 
         { 
          "_id": "59cb12c0abb4713d6632c6ef", 
          "name": "Meeting 1", 
          "date_start": "2609-03-10T13:02:40.000Z", 
          "date_ended": "2609-03-10T13:03:00.000Z", 
          ... 
         } 
        ] 
    } 
    

と結果のためのカスタムモデルで、あなたの呼び出しは次のようになります:

Call<Result<List<Meeting>>> call 
  • は、このようなあなたの応答場合は、例えば、応答へのコールパラメータを調整します

    IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAYの問題については、

    のようにAPIコードを変更できますステータスコードが `である場合は、 Result<Meeting>` isSuccessfulと() `` true`を返します、最初
    +0

    ありがとう@OkiWicaksono、あなたは私の日を救った... 良い説明... –

    関連する問題