แทนที่จะประกาศการเรียก API เหมือนที่คุณทำ:
Observable<MyResponseObject> apiCall(@Body body);
คุณยังสามารถประกาศได้ดังนี้:
Observable<Response<MyResponseObject>> apiCall(@Body body);
จากนั้นคุณจะมีสมาชิกดังต่อไปนี้:
new Subscriber<Response<StartupResponse>>() {
@Override
public void onCompleted() {}
@Override
public void onError(Throwable e) {
Timber.e(e, "onError: %", e.toString());
// network errors, e. g. UnknownHostException, will end up here
}
@Override
public void onNext(Response<StartupResponse> startupResponseResponse) {
Timber.d("onNext: %s", startupResponseResponse.code());
// HTTP errors, e. g. 404, will end up here!
}
}
ดังนั้นการตอบสนองของเซิร์ฟเวอร์ที่มีรหัสข้อผิดพลาดก็จะถูกส่งไปยังและคุณจะได้รับรหัสโดยการเรียกonNext
reponse.code()
http://square.github.io/retrofit/2.x/retrofit/retrofit/Response.html
แก้ไข:ตกลงในที่สุดฉันก็มองไปรอบ ๆ เพื่อเป็นสิ่งที่ E-Nouri กล่าวว่าในความคิดเห็นของพวกเขาคือว่ามีเพียง 2xx onNext
รหัสเพื่อจะไป ปรากฎว่าเราถูกต้องทั้งคู่:
หากมีการประกาศการโทรเช่นนี้:
Observable<Response<MyResponseObject>> apiCall(@Body body);
หรือแม้แต่สิ่งนี้
Observable<Response<ResponseBody>> apiCall(@Body body);
คำตอบทั้งหมดจะลงเอยด้วยonNext
ไม่ว่าจะเป็นรหัสข้อผิดพลาดใดก็ตาม สิ่งนี้เป็นไปได้เพราะทุกอย่างถูกห่อหุ้มด้วยResponse
วัตถุโดย Retrofit
ในทางกลับกันหากมีการประกาศการโทรเช่นนี้:
Observable<MyResponseObject> apiCall(@Body body);
หรือนี่
Observable<ResponseBody> apiCall(@Body body);
จะมีเพียงการตอบกลับ 2xx onNext
เท่านั้น ทุกสิ่งทุกอย่างจะถูกห่อในและส่งไปยังHttpException
onError
ซึ่งก็สมเหตุสมผลเช่นกันเพราะหากไม่มีResponse
กระดาษห่อหุ้มสิ่งที่ควรปล่อยออกมาonNext
? เนื่องจากคำขอไม่ประสบความสำเร็จสิ่งเดียวที่จะเปล่งออกมาคือnull
...