2017-09-26 77 views
0

我是新來的使用Retrofit並從Retrofit 2.1.0開始。 我得到respose 200 OK,但在我的call.enqueue總是運行onFailure(),邏輯上它必須運行onResponse()。我真的不知道爲什麼,並搜索相同的問題,但他們的解釋不能解決我的問題。有人可以拯救我的一天...?Retrofit 2.1.0 onFailure()在respose 200時調用OK

我有一個帖子到我的DB與API

@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); 

這是我在我的活動是如何運行

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"); 

     } 
    }); 

這裏是我的會議模式

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() == falseLog.e()輸出是「創建會議失敗」。但是,當我輸入正確的屬性,它給我的數據庫200 OK,POST,但onFailure()正在運行並運行Log.e()「失敗:工作」。

+0

第一,'isSuccessful()'返回TRUE如果狀態代碼是' 2xx..3xx'。在你的情況下,這個評估是錯誤的,所以我很好奇狀態碼可能是什麼。 另外,後續的'response.message()'揭示了什麼? – sschrass

+0

@sschrass我用'Log.e(「On Failure」,t.getMessage())編輯我的代碼以在'onFailure()'獲得消息;'並且我得到消息'On Failure:java.lang.IllegalStateException:預期的BEGIN_OBJECT,但BEGIN_ARRAY在第3行第12列路徑$ .data' –

+0

您正在使用JsonArray而解析或綁定數據使用JsonObject – 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代碼,如下所示:

@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); 

你可以用你的電話是這樣的:

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

     } 
    }); 

請注意,你必須改變Result<Meeting>Result<List<Meeting>>

+0

謝謝@OkiWicaksono,你救了我的一天... 很好的解釋... –