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 예외를유발할 수 있습니다.