선생님, 개발을 잘하고 싶어요.

URL 구조와 OkHttp3를 이용한 URL 생성 및 파싱 본문

개발/android 개발

URL 구조와 OkHttp3를 이용한 URL 생성 및 파싱

알고싶은 승민 2022. 1. 16. 19:00

URL 기본구조

<scheme>://<username>:<password>@<host>:<port>/<path>;<parameter>?<query>#<fragment>

scheme

리소스를 어떻게 접근하는가? 어떤 프로토콜을 사용하는가? (ex. http, https, ftp...)

host, port

리소스에 접근할 수 있는 서버가 어디 있나? (www.greedy0110.tistory.com)

path

리소스가 서버의 어디에 있는지 알려준다.

서버가 리소스의 위치를 찾는 데 사용하는 정보

/ 로 구분 (https://.../path1/path2)

parameter

앱이 서버에 정확한 요청을 하기 위해 필요한 입력 파라미터

; 로 시작

query

리소스 형식의 범위를 좁히기 위한 정보

?로 시작 (https://.../path?query1=hello)

& 로 별도의 query 키값 구분 (https://.../path?query1=hello&query2=world)

fragment

리소스의 일부를 지정. 

#으로 시작 (https://.../path#fragment)

username, password

사용자 식별 (요즘엔 별도의 방법으로 사용자 인증을 하기 때문에 많이 쓰이지 않는다.)

 

OkHttp3.HttpUrl

url을 표현하기 위해서 OkHttp3 라이브러리에 들어있는 HttpUrl의 사용법을 알아보자.

생성

val url = HttpUrl.Builder()
    .scheme("https") // Either "http" or "https"
    .username("greedy0110")
    .password("12341234")
    .host("www.greedy0110.tistory.com")
    .port(80)
    .addEncodedPathSegment("105%20version")
    .addPathSegment("106 version")
    .addQueryParameter("name", "seungmin shin")
    .fragment("references")

결과

https://greedy0110:12341234@www.greedy0110.tistory.com:80/105%20version/106%20version?name=seungmin%20shin#references

 

파싱

val rawUrl = "https://greedy0110:12341234@www.greedy0110.tistory.com:80/105%20version/106%20version?name=seungmin%20shin#references"
val url = rawUrl.toHttpUrlOrNull()!!
with(url) {
    println(scheme)
    println(username)
    println(password)
    println(host)
    println(port)
    println(pathSegments)
    println(queryParameterNames)
    println(fragment)
}

결과

https
greedy0110
12341234
www.greedy0110.tistory.com
80
[105 version, 106 version]
[name]
references

 

참고자료

HTTP 완벽 가이드 현재 읽고 있습니다. 두꺼운데 술술 읽히는 내용입니다. HTTP 초심자가 읽기 정말 좋은 듯합니다.

HttpUrl - OkHttp Square 공식 Doc입니다. 왜 java.net.URI, java.net.URL 대신 이 클래스를 설계했는지 보여줍니다.

Comments