Как я могу обрабатывать пустое тело ответа с Retrofit 2?
недавно я начал использовать Retrofit 2 и я столкнулся с проблемой с разбором пустого тела ответа. У меня есть сервер, который отвечает только с http-кодом без какого-либо содержимого внутри тела ответа.
Как я могу обрабатывать только метаинформацию об ответе сервера (заголовки, код состояния и т. д.)?
спасибо заранее!
4 ответов:
Edit:
как указывает Джейк Уортон,
@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, используйте что-то вроде :
@GET("/path/to/get") Observable<Response<Void>> getMyData(/* your args here */);
если вы используете RxJava, то лучше использовать
Completableв этом случаепредставляет отложенное вычисление без какого-либо значения, но только указание на завершение или исключение. Класс происходит по аналогичной схеме мероприятии в качестве реактивного потока: onSubscribe (число|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.
вот как я использовал его с Rx2 и Retrofit2, с запросом PUT REST: Мой запрос имел тело 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"); } }); }
Comments