RXJava에서 ETag 캐시 사용 방법

3710 단어
아니면 시작 그림의 문제입니다. 이전 버전은 대기열 캐시 시작 그림을 사용했지만 ios 측에서 항상 문제가 발생했습니다. 부득이하게 이 버전에서 백그라운드가 다시 나타나서 시작 그림 표시 로드 규칙을 제정했습니다. 그래서 이 블로그가 생겼습니다.
ETag 문자열은 일반적으로 서버 캐시를 표시하는 데 사용되며, 클라이언트가 처음 요청할 때 서버는 현재 데이터에 따라 ETag 문자열을 생성하여response에서 되돌려줍니다.클라이언트는 이 ETag 문자열을 저장합니다. 클라이언트가 같은 URL 요청을 다시 보낼 때 헤더에서 If-None-Match 필드를 통해 이 문자열을 서버에 보냅니다. 서버는 비교 전후 ETag의 값에 따라 304로 돌아가서 클라이언트에게 캐시를 사용해야 하는지 알려 줍니다.
retrofit의 네트워크 설정에서는 일반적으로 인터페이스를 정의합니다.
@GET("/splash_image")
void loadSplashImg(@Header("a") String a,Callback response);

rxjava+retrofit에서 우리는 보통 작은 변화를 했을 뿐이다.
@GET("/splash_image")
Observable loadSplashImg(@Header("a") String a);

그러나 이렇게 하면 요청 헤더에서 되돌아오는 ETag 문자열을 받을 수 없습니다.이때 우리는 되돌아오는 값을 바꾸어야 한다.
@GET("/splash_image")
Observable loadSplashImg(@Header("a") String a);
//if_none_match  ETag 
   HttpUtils.getInstance().getV4ApiServer().
                loadSplashImage(HttpUtils.getInstance().getHeaderStr("GET"), if_none_match).
                subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).
                map(new Func1>() {
                    @Override
                    public List call(Response response) {

                        List
headers = response.getHeaders(); String etag = null; // header key, ETag, for (Header h : headers) { if (h.getName().equalsIgnoreCase("ETag")) { etag = h.getValue(); } } List list = null; try { // response InputStream stream = response.getBody().in(); byte[] buffer = new byte[2048]; int readBytes = 0; StringBuilder stringBuilder = new StringBuilder(); while ((readBytes = stream.read(buffer)) != -1) { stringBuilder.append(new String(buffer, 0, readBytes)); } Gson gson = new Gson(); // response body , gson, list = gson.fromJson(stringBuilder.toString(), new TypeToken>() { }.getType()); if (list != null) { for (JumpItemBean j : list) { j.setETAG(etag); } } handleSplashList(list); return list; } catch (IOException e) { e.printStackTrace(); } return null; } }).subscribe(new Observer>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { if (RxThrowable.getHttpCode(e) == 304) { // HttpCode } } @Override public void onNext(List jumpItemBeen) { // } });

좋은 웹페이지 즐겨찾기