Edytować:
Jak podkreśla Jake Wharton,
@GET("/path/to/get")
Call<Void> getMyData(/* your args here */);
to najlepszy sposób w porównaniu z moją pierwotną odpowiedzią -
Możesz po prostu zwrócić a ResponseBody
, co spowoduje ominięcie analizy odpowiedzi.
@GET("/path/to/get")
Call<ResponseBody> getMyData(/* your args here */);
Wtedy w twoim wezwaniu
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
które nie tylko ma lepszą semantykę, ale jest (nieco) bardziej wydajne w pustym przypadku i znacznie bardziej wydajne w niepustym przypadku (gdy po prostu nie dbasz o treść).Void
. Czy użycieUnit
w kodzie Kotlin dałoby te same korzyści, coVoid
w Javie dla Retrofit?Unit
w Kotlinie NIE działa,Void
jednak działa. Zakładam, że gdzieś jest zakodowany czek.Jeśli używasz RxJava, lepiej jest użyć
Completable
w tym przypadkuhttp://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Completable.html
w zaakceptowanej odpowiedzi:
Jeśli punkt końcowy zwróci kod odpowiedzi błędu, będzie on nadal znajdował się w
onNext
i będziesz musiał samodzielnie sprawdzić kod odpowiedzi.Jeśli jednak używasz
Completable
.będziesz miał tylko
onComplete
ionError
. jeśli kod odpowiedzi się powiedzie, zostanie uruchomiony, aonComplete
inny zostanie uruchomionyonError
.źródło
onError
Throwable
w takim razie będzie zawierał argument? Uważam, że jest to czystsze, ale często nadal musimy patrzeć na kod odpowiedzi i treść pod kątem błędów.Jeśli używasz rxjava, użyj czegoś takiego:
źródło
Oto jak użyłem go z Rx2 i Retrofit2, z żądaniem PUT REST: Moje żądanie miało treść json, ale tylko kod odpowiedzi http z pustą treścią.
Klient API:
Interfejs:
Następnie, aby go użyć:
źródło