Android 개발자를위한 실제 네트워크 (1 부)

( 2020 년 11 월 7 일)

모든 애플리케이션을위한 간편한 데이터 레이어

다음은이 시리즈의 블로그 목록입니다.

  • ( 파트 1 — HTTP 및 네트워크 레이어 )
  • (파트 2— TLS, 인증서 및 고정)
  • (파트 3-인증 자 및 인터셉터)
  • (파트 4-성능, 중복성 및 동시성)
  • (파트 5-테스트 및 통합)
Android 개발자를위한 실제 네트워크

이 시리즈의 첫 번째 부분 인 Android 개발자를위한 실제 네트워크 일반적으로 해결되는 다른 비전을 가진 네트워크 데이터 레이어에 대해 이야기 할 때 d, Android의 네트워킹은 작동하기 어렵습니다. 여러 사업자, 다양하고 풍부한 콘텐츠, 스트리밍 및이 모든 것이 하나의 세부 사항을 놓치지 않고 사용자에게 도달해야합니다

HTTP 및 네트워크 계층

Http는 네트워크 프로토콜입니다. 사용중인 인터넷에 연결하는 경우 정의의 예쁜 버전은 Http가 다음과 같습니다.

“An 애플리케이션 레이어 분산, 협업, 하이퍼 미디어 정보 시스템”

이것은 기본적으로 웹 사이트를 구축하는 경우 여러 가지를 의미합니다. , 스마트 폰 앱, IoT, 파일 다운로드만으로도이 프로토콜을 사용하고 있습니다. 간단한 HTML이있는 웹 페이지에서 웹 애플리케이션으로 모바일 앱으로 성장했으며 일반적으로 사용되는 API 레이어로 진화했습니다.

Http 요청 ts는 사용자가 모바일 앱과 상호 작용할 때 사용자에 의해 생성되며, 일부 클릭, 스크롤 또는 삭제 (예 : Gmail을 상상해보세요)가 발생하면 서버에서 정보를 요청하기 시작합니다. 앱 내부에 Http 요청을 입력 할 때마다 이메일이 새로 고쳐 지도록 이메일을 삭제하거나 응답하거나 열면 Http 요청이 생성되고 이러한 Http 요청은 원본 서버 또는 프록시 캐싱 서버로 이동하며 해당 서버는 Http 응답을 생성합니다. 일반적으로 모든 요청 / 응답 집합에는 다음이 포함됩니다.

  • 요청 — HTTP 요청 만들기 URL에 연결
  • 응답 — 요청은 오류 또는 성공 일 수있는 응답을 반환합니다.
  • 파싱 할 수있는 데이터 — 모바일에서는 개체, 데이터에 대한 응답을 파싱해야합니다. Moshi, Json, Gson *과 같은 타사를 사용하여 앱 내에서 사용할 수있는 Class 또는 Struct를 직접 만들 수도 있지만 휴대 전화에 도달하면 일반 문자열입니다.

일반적으로 모든 Http 요청 / 응답에는 다음 두 가지 항목이 있습니다.

  • Uniform Resource Locator : URL은 특정 위치, 주소입니다. 특정 유형의 방법으로 인터넷 어딘가에
  • 헤드 ers : 클라이언트와 서버가 HTTP를 통해 추가 정보를 전달합니다. 요청 또는 응답. HTTP 헤더는 대소 문자를 구분하지 않는 이름과 콜론 (:), 그 값으로 구성됩니다.
  • Body : 본문 콘텐츠를 노출하는 간단한 문자열 인 실제 응답은 어떤 메서드 (예 : Unit)에서도 아무것도 아닐 수 있습니다.

우리는 모든 요청에 ​​대해 응답을받습니다. 성공하지 않더라도이를 알 수있는 상태 코드가 있습니다.

  • 1xx — 모든 것이 멋집니다. 잠시만 기다려주세요.

    • 1xx li>
    • 2xx — 모든 것이 정상입니다. 이것은 완전히 연속적인 응답입니다.
    • 3xx — 응답이 다른 곳에 있습니다. 당신은 잃어 버렸습니다.
    • 4xx— 클라이언트의 요청은 다음과 같습니다. 제대로 이행되지 않아 모바일 측의 오류입니다.
    • 5xx — 서버가 올바른 요청을 이행하지 못 했으므로 백엔드 측의 오류입니다.

    HTTP 메소드

    여러 HTTP 메소드가 있습니다.

    • @GET: 리소스에 대한 정보를 읽거나 검색하는 데 사용됩니다. GET 요청은 데이터를 읽는 데만 사용되며 변경하지 않으며 안전한 것으로 간주됩니다.
    • @POST: 새 리소스 생성에 사용됩니다. 특히 하위 리소스를 만드는 데 사용됩니다. 안전하지도 멱등 성도 아닙니다. 따라서 비멱 등성 리소스 요청에 권장됩니다.두 개의 동일한 POST 요청을 수행하면 동일한 정보를 포함하는 두 개의 리소스가 생성 될 가능성이 높습니다.
    • @PUT: 업데이트 기능에 사용되며 알려진 리소스 URI로 PUT-ing됩니다. 원본 리소스의 새로 업데이트 된 표현을 포함하는 요청 본문을 사용합니다. PUT는 서버에서 상태를 수정 (또는 생성)한다는 점에서 안전한 작업이 아니지만 멱 등성입니다. 즉, PUT를 사용하여 리소스를 만들거나 업데이트 한 다음 동일한 호출을 다시 수행하면 리소스가 여전히 존재하며 첫 번째 호출과 동일한 상태를 유지합니다.
    • @DELETE: URL로 식별 된 리소스를 삭제하는 데 사용됩니다.
    • @PATCH: 기능을 수정하는 데 사용됩니다. PATCH 요청은 전체 리소스가 아닌 리소스에 대한 변경 사항 만 포함하면됩니다. PATCH는 안전하지도 멱등 성도 아닙니다.

    어쨌든, 모바일 애플리케이션에 대해 이러한 메소드 내부의 수정은 매우 위험 할 수 있습니다. 응답에서 변수를 이중으로 수신하는 애플리케이션을 상상할 수 있습니다. , 이것이 어떻게 든 부울로 변경되면 데이터 파싱이 깨질 것입니다. 이것은 백엔드 엔지니어가 프로덕션에서 참조되는 엔드 포인트를 변경할 때마다 고려해야하는 큰 함정입니다.

    HttpClient

    오늘날 대부분의 Android 애플리케이션은 API를 기반으로합니다. API는 일반적으로 HTTP를 통해 액세스 할 수 있고 사용자가 애플리케이션과 상호 작용할 수 있도록하는 리소스를 노출하는 RESTful 웹 서비스입니다 (대부분 액세스하려면 HttpClient가 필요합니다). 인터넷에 연결하고 사용자를 위해 데이터를 가져 오기 시작합니다.

    Android에는 OkHttpClient라는 HttpClient를 몇 초 안에 생성하는 놀라운 라이브러리가 있습니다. 이렇게하면 readTimeOut 및 ConnectionTimeOut이있는 클라이언트가 생성됩니다.이 시간 경과에 서버가 응답을 제공하지 않으면 연결에 실패하게됩니다.
    정말 중요한 부분이 있습니다. 이 클라이언트에 캐시 용 빌더를 배치 할 수도 있습니다 (그리고이 연재물에서 나중에 설명 할 다른 많은 것).

    캐시

    네트워크를 통해 리소스를 가져 오는 것은 느리고 비용이 많이 드는 주된 이유는 모바일에서 여러 가지에 의존하기 때문입니다. 예를 들어 사용자가있는 네트워크, 5G에서 3G, 광섬유가있는 WIFI에서 통신 케이블까지

    캐시가 설계되었습니다. 모든 사람, 심지어 사용자에게도 네트워크 통화를 개선하기 위해 불필요한 네트워크 요청없이 종료됩니다. 캐칭은 DNS에 대한 원래 호출을 대체하지 않습니다. 인스턴스별로 캐시는 소스에서 데이터를 가져 오는 대신 사용할 수 없습니다.

    데이터베이스 캐싱
    실제로는 네트워크 계층에 관한 것이 아니라 정보에 대해 API에 요청하고이를 SharedPreferences, DataStore 또는 관계형이거나 비 관계형 일 수있는 모든 데이터베이스에 저장합니다. 데이터베이스가 제공하는 속도와 처리량의 성능은 애플리케이션의 전체 성능에 가장 큰 영향을 미칠 수 있습니다.

    콘텐츠 전송 네트워크
    서버 트래픽이 전 세계에있을 때 전 세계에 걸쳐 전체 인프라를 복제하는 것이 항상 쉽고 비용 현명한 방법은 아닙니다.이를 위해 다음과 같은 기능을 제공하는 CDN이 있습니다. 글로벌 엣지 로케이션 네트워크를 활용하여 이미지, 스트리밍 및 비디오를 포함한 API 콘텐츠의 캐시 된 사본을 제공합니다.

    도메인 이름 시스템
    인터넷에서 이루어진 모든 도메인 요청은 기본적으로 도메인 이름과 관련된 IP 주소를 확인하기 위해 DNS 캐시 서버를 쿼리합니다. DNS 캐싱은 OS, ISP 및 DNS 서버를 포함한 다양한 수준에서 발생할 수 있습니다.

    특히 네트워크의 경우 HttpClient 핸들 캐시 (위 코드 확인) 및 비 캐시를 만들 수 있습니다. 일부 응용 프로그램에서는 캐시를 건너 뛰고 서버에서 직접 데이터를 가져와야 할 수 있습니다. 전체 새로 고침을 강제하려면 OkHttpClient의 캐시 빌더에 직접 no-cache를 추가하세요. 이러한 유형의 호출을 수행하는 결정은 기술적 인 관점보다 제품 측면에서 특히 더 중요합니다.

p>

이 부분은 모두 게시물입니다. . 다음 부분에서는 인증서, 고정 및 TSL에 대해 설명하겠습니다.

도움이 필요한 경우 :

항상 기꺼이 도와 드리겠습니다. 여기에서 저를 찾을 수 있습니다.
Medium as
Twitter as @ddinorahtovar
StackOverflow as Dinorah Tovar

행복한 코딩! 👩🏻‍💻