HTTP 구성요소(Compoenent)¶
ahttp_client 의 구성요소는 Query, Header, Path, 그리고 Body가 있으며,HTTP 요청을 처리하는 과정에서 사용합니다. 구성요소는 typing.Annotated 를 이용하여 정의합니다.
list_repository_activites 메소드 같은 경우, 요청은 아래와 같이 이루어집니다.
1@Session.single_session("https://api.github.com/")
2@request("GET", "/repos/{owner}/{repo}/activity")
3def list_repository_activites(
4 session,
5 owner: Annotated[str, Path],
6 repo: Annotated[str, Path],
7 activity_type: Annotated[str, Query],
8 authorization: Annotated[str, Header]
9) -> dict[str, Any]:
10 return await response.json()
11
12await list_repository_activites(
13 owner="gunyu1019",
14 repo="ahttp_client",
15 activity_type="push",
16 authorization="Bearer <GITHUB TOKEN>"
17)
18
19# curl https://api.github.com/repos/gunyu1019/ahttp_client/activity?activity_type=push \
20# -H "authorization: Bearer <GITHUB TOKEN>"
참고
HTTP 구성요소(Component)는 typing.Annotated 대신에 typing.Union 으로 정의할 수 있습니다.
@Session.single_session("https://api.github.com/")
@request("GET", "/repos/{owner}/{repo}/activity")
def list_repository_activites(
session,
owner:str | Path,
repo: str | Path,
activity_type: str | Query,
authorization: str | Header # or, authorization: typing.Union[str, Header]
) -> dict[str, Any]:
return await response.json()
하지만, typing.Anntoated 를 이용하는 것을 권장합니다.
구성 요소(Compoenent)의 용도¶
Header - HTTP 요청에서 header를 정의합니다.
Body - HTTP 요청에서 body를 정의합니다.
Form - aiohttp.FormData 를 이용하여 HTTP 요청에서 body 부분으로 정의합니다.
BodyJson - Dictionaries 를 이용하여 HTTP 요청에서 body 부분으로 정의합니다.
Query - URL 매게변수의 값을 삽입하는 용도로 정의됩니다.
Path - URL에 지정된 값을 삽입하는 용도로 사용됩니다.
경고
HTTP request deccoration에서 Body 매개변수를 정의하는 것은 Body, BodyJson, Form 중에서 하나만 사용할 수 있습니다. 하나 이상의 Body 매게변수를 정의한다면, TypeError 예외를 발생시킬 수 있습니다.
Custom Component Name¶
PEP 8 규칙에 따르면, 매개변수는 반드시 밑줄을 사용한 lowercase를 따르도록 하고 있습니다. (참조 문서)
하지만 API에서 parameter 또는 header의 이름은 Camel Case 또는 Pascal Case 일 수 있습니다.
PEP 8 규칙을 따르기 위해, ahttp_client 패키지는 custom component name 기능을 지원합니다.
1@Session.single_session("https://api.github.com/")
2@request("GET", "/repos/{owner}/{repo}/activity")
3def list_repository_activites(
4 session,
5 owner: Annotated[str, Path],
6 repo: Annotated[str, Path],
7 activity_type: Annotated[str, Query],
8 token: Annotated[str, Header.custom_name("Authorization")]
9) -> dict[str, Any]:
10 return await response.json()
11
12await list_repository_activites(
13 owner="gunyu1019",
14 repo="ahttp_client",
15 activity_type="push",
16 token="Bearer <GITHUB TOKEN>"
17)
18
19# curl https://api.github.com/repos/gunyu1019/ahttp_client/activity?activity_type=push \
20# -H "Authorization: Bearer <GITHUB TOKEN>"
위에 작성된 예제와 같이, GITHUB API TOKEN 값은 list_repository_activites 의 token 인수로 삽입하였습니다. HTTP 호출 처리 과정에서 token 인수의 값은 매개변수의 이름을 따른 것이 아닌, “Authorization” 를 가지고 header에 삽입되었습니다.
경고
Custom Compoenent Name 기능은 Header, Query, BodyForm, 그리고 Form에만 사용할 수 있습니다. 다른 구성요소에서는 TypeError 예외를유발할 수 있습니다.