回答:
編集:
ジェイクウォートンが指摘するように
@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
}
});
Void
。Unit
Kotlinコードでの使用はVoid
、Java for Retrofit と同じ利点をもたらしますか?
Unit
Kotlinでは機能しませんが、Void
機能します。どこかにハードコードされたチェックがあると思います。
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
ます。
onError
Throwable
その場合、議論には何が含まれますか?私はこの方がきれいだと思いますが、それでも多くの場合、失敗の応答コードと本文を調べる必要があります。
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");
}
});
}
Void
セマンティクスが向上しているだけでなく、空の場合は(わずかに)より効率的であり、空ではない場合(ボディに関心がない場合)は非常に効率的です。