Retrofit 2로 빈 반응 바디를 어떻게 처리 할 수 있습니까?
최근에 사용하기 시작했고 Retrofit 2
빈 응답 본문을 구문 분석하는 데 문제가 발생했습니다. 응답 본문에 내용이없는 http 코드로만 응답하는 서버가 있습니다. 서버 응답 (헤더, 상태 코드 등)에 대한 메타 정보 만 처리하려면 어떻게해야합니까?
미리 감사드립니다!
편집하다:
Jake Wharton이 지적했듯이
@GET("/path/to/get")
Call<Void> getMyData(/* your args here */);
원래 반응과 비교하는 가장 좋은 방법입니다.
ResponseBody
응답 구문 분석을 무시하는을 반환하면 됩니다.
@GET("/path/to/get")
Call<ResponseBody> getMyData(/* your args here */);
그리고 당신의 전화에서
Call<ResponseBody> dataCall = myApi.getMyData();
dataCall.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Response<ResponseBody> response) {
// use response.code, response.headers, etc.
}
@Override
public void onFailure(Throwable t) {
// handle failure
}
});
RxJava를 사용 Completable
하는 경우이 경우 에 사용하는 것이 좋습니다
값이없고 완료 또는 예외에 대한 표시 만있는 지연된 계산을 나타냅니다. 클래스는 Reactive-Streams와 유사한 이벤트 패턴을 따릅니다. onSubscribe (onError | onComplete)?
http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Completable.html
허용 된 답변에서 :
@GET("/path/to/get")
Observable<Response<Void>> getMyData(/* your args here */);
엔드 포인트가 실패 응답 코드를 리턴하는 경우 여전히 onNext
코드에 있으며 응답 코드를 직접 확인해야합니다.
그러나를 사용하는 경우 Completable
.
@GET("/path/to/get")
Completable getMyData(/* your args here */);
당신은 단지 것 onComplete
하고 onError
. 응답 코드가 성공하면 onComplete
다른 코드가 실행되고 다른 코드가 실행됩니다 onError
.
rxjava를 사용하는 경우 다음과 같은 것을 사용하십시오.
@GET("/path/to/get")
Observable<Response<Void>> getMyData(/* your args here */);
다음은 PUT REST 요청과 함께 Rx2 및 Retrofit2와 함께 사용한 방법입니다. 요청에 json 본문이 있지만 빈 본문이있는 http 응답 코드 만 있습니다.
Api 클라이언트 :
public class ApiClient {
public static final String TAG = ApiClient.class.getSimpleName();
private DevicesEndpoint apiEndpointInterface;
public DevicesEndpoint getApiService() {
Gson gson = new GsonBuilder()
.setLenient()
.create();
OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
okHttpClientBuilder.addInterceptor(logging);
OkHttpClient okHttpClient = okHttpClientBuilder.build();
apiEndpointInterface = new Retrofit.Builder()
.baseUrl(ApiContract.DEVICES_REST_URL)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
.create(DevicesEndpoint.class);
return apiEndpointInterface;
}
인터페이스 :
public interface DevicesEndpoint {
@Headers("Content-Type: application/json")
@PUT(ApiContract.DEVICES_ENDPOINT)
Observable<ResponseBody> sendDeviceDetails(@Body Device device);
}
그런 다음 사용하십시오.
private void sendDeviceId(Device device){
ApiClient client = new ApiClient();
DevicesEndpoint apiService = client.getApiService();
Observable<ResponseBody> call = apiService.sendDeviceDetails(device);
Log.i(TAG, "sendDeviceId: about to send device ID");
call.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<ResponseBody>() {
@Override
public void onSubscribe(Disposable disposable) {
}
@Override
public void onNext(ResponseBody body) {
Log.i(TAG, "onNext");
}
@Override
public void onError(Throwable t) {
Log.e(TAG, "onError: ", t);
}
@Override
public void onComplete() {
Log.i(TAG, "onCompleted: sent device ID done");
}
});
}
참고 URL : https://stackoverflow.com/questions/33228126/how-can-i-handle-empty-response-body-with-retrofit-2
'program story' 카테고리의 다른 글
파일의 처음 n 줄만 잡을 수 있습니까? (0) | 2020.07.28 |
---|---|
ConnectivityManager getNetworkInfo (int) 추천하지 않습니다 (0) | 2020.07.28 |
“-”대시를 사용하여 JSON 속성에 액세스 할 수 없습니다 (0) | 2020.07.28 |
안드로이드에서 UI 스레드를 감지하는 방법? (0) | 2020.07.28 |
dplyr을 사용하여 테이블의 모든 행에 함수를 적용 하시겠습니까? (0) | 2020.07.28 |