본문 바로가기

Network

Http (GET,POST) 게시물 조회, 전체 게시물 조회, 회원가입

목차


HTTP vs Socket 통신

 

Http 통신

- rest API 라고 함

 

 

Sockect 통신은

실시간으로 동기화 되는걸 할 거임

포톤 같은거임!

그래서 서버랑 클라이언트가 계속 연결되어 있는거임!

서로 계속 살아있는지 체크 함


Http 의 종류

 

Http 에서는 4가지가 있음!

Post => 회원가입 할 때, 정보저장할 때.

Get => 로그인하면 정보 받을 수 있음! 그때

Put =>  개인정보 수정 할 때.

Delete => 회원 탈퇴

 

아직은 서버에서 저장하는 수준이 아니라서,

Post, Put, Delete 는 나중에.

 

Get 은 해볼거임! 다른데서 데이터를 가져와서.

간단하게 Get 을 먼저 진행 해볼거임

 


Http - Get ( 예제 확인하기 )

 

여기 들어가보면 데이터를 조회 해볼 수 있는 예제들이 있음

 

여기서 post ㄱㄱ!
꼭 이런형식은 아니지만, 예를 이렇게 든거임!

우리는 요청을 이렇게 주소로 하고,

저 값을 받아오는걸 해볼거임

Post 에 /1 을 붙여서 쓰면 저렇게 첫번째가 뜬다.

이건 근데 서로 얘기가 되어 있어야 하는거임

 -> 프로토콜이라고도 함

user 로 들어가보면 이런식으로 user 정보 예제도 나와있음!

Json 에 Json 에 Json 을 하는 모습

Id=1 인 애들만 온 모습
이렇게 검색하면

postId 가 1 이고, id = 1 인 애들만 뽑힙


Http - Get ( 예제 진행하기 )

우리는 저기 URL 에서 예제들을 가지고와서, 사용해보는 일을 해볼거임!

이걸 해볼거임!

 

UI 를 만들자!

버튼 생성
스크립트 생성

Canvas 에 넣자

함수 하나 만들어 놓음

 

빈 게임오브젝트

하나 생성하고 같은이름의 Script 파일도 Assign 하자

 

아까 함수로 눌러서 요청을 보내고

HttpManager 한테 알려주려고 하는거임

 

HttpManager.cs

싱글톤으로 만드는 이유 = 하나만 존재하기 위해서,

근데 그렇지 않다라는건, Instance 에 누가 들어가 있다는거임

이미  만들어져 있으면 지워버리겠다는거임!

 

 =>  씬이 전환되도 파괴되지 않게 끔 할거임!

이걸 안해버리면, 씬을 다시 로드 할 때 하나가 더 생겨버림.

스태틱이라 하나밖에 못 쓰는데.

그러면 이게 이런식으로 생겨버림.
이런식으로 될 수도 있고

그래서 Destroy 쓰는거임!


HttpManager 에서 서버에게 요청하기

HttpManager.cs

코루틴으로 진행 할거임!

 

 

(참고)  코루틴을 이렇게 쓸 수도 있음!

 

다시 돌아와서,

 

서버한테 이제 요청을 할건데

2가지 정보를 요청 해달라고 파라미터 값으로 던져줘야함

1. URL 

2. 어떤 방식으로 할건지 

 

그래서 이 두개를 세팅 할 수 있는 Class 를 하나 더 만들어 보자

HttpRequester.cs 생성

 

 

Action 은 함수를 넣을 수 있는 자료형임! -> Deligate(대리자) 

int number 는 숫자를 담을 수 있는 자료형인 것 처럼!

 

이거 쓸려면 네임스페이스에 using System; 추가 해줘야함!

 

(참고) Action 테스트!! 

더보기
이렇게 변수에 함수를 추가해서 사용가능!
매개변수가 int 인 함수들만 넣게 할 수도 있음!

그냥 Action 이면 무조건 void 함수만 넣을 수 있음!

 

UIManager 로 돌아와서, 버튼 함수를 작성하자.

OnClickGetPost() 함수 작성

Requester 가져와서, 거기에 있는 url, Type, onComplete 를 넣고

 

HttpManager 에 있는 SendRequest 를 해서 요청한다.

HttpManager 에 요청함수

SendRequest 에 가서, HttpRequester 의 Class 의 틀로 요청을 보내야 함!

 

요청할 때, requester의 틀이 필요함  여기에 넣어줬으니,

버튼눌러서 요청할 때도 같이 넣어줌!


서버에 직접적으로 요청을 보내는 Send함수 작성

UnityWebRequest 라는 클래스를 사용해서 우리는 통신을 할거임

네임스페이스는 UnityEngine.Networking 이 필요함

타입에 따라 다르게 써놓은 모습

UnityWebRequest webRequest = null; 은 처음에 세팅할 때 아무것도 없다. 라고 세팅하는거임!

요청종류에 따라서 다르게.

우리는 Get 을 쓸거니까 이렇게!

requester 의 requesterType 이 Get 인경우에는 우리는 Get 메소드를 쓸 거임!

Get 은 parameter 에 url 이 필요하다!

완료되었다면 onComlete 실행하게 함

(참고) 이 Action 함수를 안쓰면 이런식으로 써줘야 한다..

더보기
저게 없었다면 이렇게 해줘야 함;;

게시물조회 버튼 설정을 해준다.

 -> 인스펙터창에서 OnClickGetPost() 함수도 넣는다.

그러면 이렇게 받을 수 있음!

 

URL 을 일부러 다르게 써놓고

실패 해보자.

downloadHandler => 서버에서 받은 내용들이 담겨있는곳

 


Http-Get 으로 downloadHandler 에 받아온 Json형식 데이터를  가공하기

프로토콜!

지금 downloadHandler 라는곳에 들어온 값이 저장되어있음 

 

즉, 결과는 downloadhandler 에서 json 형식으로 넘어왔음

이 json 형식을 다시 풀어보자!

 

HttpManager 에서

이렇게 키값을 넣자!

이걸 잠시 잘라내고 HttpRequester 에다가 만들어보자!

여기에 항상 틀을 만들었으니까

 

HttpRequester.cs --->

위에 클레스를 하나 만든다!

외부에서 접근을 해야 하므로 public 을 다 붙여 넣어주자!

json 쓸려면,

이렇게 쓰자!

틀을 만들어 준다

 

HttpManager.cs 로 돌아와서,

이런식으로 해서  가져올 수 있다!

 

이렇게 Json 으로 가져오면, 

postData.body

postData.Id 이런식으로 해서 가져와서 쓸 수 있음!

완료되었다는 함수 Action 까지 넣는다.

이제 FromJson 을 했기 때문에, 여기 안에있는 값들을 가공할 수 있음!


UImanger 에 있는 OnCompleteGetPost()에서 FromJson 하게 해주기

 

이게 무슨말이냐면, 

HttpManager 에서, 응답이 성공했다면,

url(주소) 에 있던거 Print 하고

FromJson 으로 형식 바꿔주고

onComplete 함수 를 실행 (지금은 onComplete 에 UImanger 에 있는 OnCompleteGetPost 가 담겨있음) 가 실행된다.

 

지금은 이렇게 되어있긴 함,,

근데 이게

여기서 나중에 PostData 의 형식이 다른걸로 바뀐 상태. 즉, 다른 형식을 요청하고 싶으면

이게 엄청 길어질 수 있음.

어떤 요청을 받았을때 이 형식을 써주고,

저런 요청을 받았을때는 다른 형식을 써주고..

 

그래서 그걸 여기(HttpManager)에서 Json 으로 처리하지말고,

UImanager 에 있는 onCompleteGetPost() 에서 처리 하도록 하자.

그게 훨씬 보기 편하고 더 효율적일 수 있음!

사실 UImanager 에 OnCompleteGetPost 는 그걸 위해 존재하는거였음  

 

이제 OnCompleteGetPost 함수에서 PostData 형식의 Json 을 처리하도록 해보자!

1. HttpRequester 에 있는 Action 델리게이트에 매개변수로 DownloadHandler 를 추가 해준다.

 

 onComplete 에 UImanager 에 있는 OnCompleteGetPost 가 담겨있는데,

여기서 이제 downloadHandler 에 담겨있는애를 Json 으로 처리 해야해서 Action 에 저렇게 써줘야함

Action 을 쓰려면 그렇게 해줘야함 어쩔 수 없음!

 

(참고) Action 에 뭐가 담겨있고 왜 담겨있는 지 설명

더보기

여기 UIManager 에서 보면,

OnClickGetPost() 함수(게시물조회 버튼을 클릭하면 실행되게 할 함수)

 

에서 HttpRequester 클래스의 틀에 맞는걸 넣어주고 있고,

여기서 onComplete 에 OnCompleteGetPost 를 넣어놨음

그렇기 때문에 onComplete 함수가 실행되면 OnCompleteGetPost 함수가 실행되는거임!

(참고) 현재 HttpRequester.cs 에 있는 틀

public class HttpRequester : MonoBehaviour
{
    // URL
    public string url;
    // 요청 타입 (GET, POST, PUT, DELETE)
    public RequestType requestType;

    // 응답이 왔을 때 호출 해줄 함수 (Action)
    // Action : 함수를 넣을 수 있는 자료형임!
    public Action<DownloadHandler> onComplete;

    public string postData; //(body)
    // 반환 자료형 void, 매개변수 없는 함수를 넣을 수 있다.
}

 

 

이제 매개변수가 DownloadHandler 가 들어가 있는 함수를 담을 수 있음!

근데 이제 이렇게되면 Action에 매개변수가 들어가기 때문에,

그걸 담는 함수도 꼭 그 매개변수  (DownloadHandler) 가 들어가야 함

지금 DownloadHandler 가 없어서 함수를 담을 수 없는 모습

UIManger 에서 바꿔주고 있는 모습

 

 

HttpManager 에서 onComplete 를 작성한 곳에도 매개변수로 바꿔주자 --->

onComplete 에도 매개변수 넣어준 모습

 

 

그리고 HttpManager 에 있었던 PostData postData = JsonUtilitu.FromJson<PostData>(handler.text);

를 잘라내서

 

OnCompleteGetPost 에 넣자!

 

여기에 이제 Json 으로 받아왔으니까,

UI.title = 

뭐 이런식으로 해서 하나씩 우리가 따와서 사용할 수 있음!!


Http -Get  전체 데이터 받아오기

 

데이터 1개

아까는 이런식으로 첫 번째 데이터만 받아왔기 때문에, 리스트를 쓸 필요없었지만

이제는 모든 데이터(저렇게 생긴거 100개)를 다 받아와서,

그 데이터의 리스트 Json 형식을 가공해볼 거임!

 

UImanger.cs 에서

OnClickGetPost 랑 OnCompleteGetPost 두개 복붙해서 이름에 All 붙이자

 URL 에서 /1 을 뺀다.

저 주소에 있는 모든걸 다 가져올거임

저 주소에 있는 데이터들,, 리스트형식으로 있다.

여기에서는

아까 썼던 이 줄을 뺀다.

이제 다량의 정보를 받을 거니까 형식이 맞지 않기 때문!

 

버튼도 이런식으로 만듦

전체 게시물 조회 버튼도 On Click() 에 All 함수를 넣어준다.

 

전체게시물 조회 눌러보면

이렇게 엄청 많은 배열이 나옴

이 배열 Json 을 이제 List 로 받아보자!

이 배열들은 PostData 를 여러개 들고있는 배열임

 

그러므로, HttpRequester 에서

PostDataArray 를 작성해주자

이런 틀들은 항상 HttpRequester 클래스 에서 써주는거임~~

그럴라고 만든거임!

 

이제 배열들에 "data" 를 써줘야함

이게 Json 형식이니까

 

각 배열들의 Key 값이 있는것 처럼

이 리스트에도 Key 값이 있어야한다

전체를 다 받을 수 있는 함수를 만든다

그렇기에 받을 때도 이런 작업을 해준다!

 

만약에 서버에서 이런 data 라는 키값을 주면 이렇게 해줄 필요는 없는데

지금 예제에서는 저 리스트의 키값이 없기 때문에 우리가 임의로 만들어주는거임!

String  S 를 data 라는 키값을 넣어줘서 임의로 만들고,

FromJson 으로 s 를 받아서 

아까 우리가 만든 PostDataArray 형식으로 받아서 올 수 있는거임!


Http - Post  방식으로 Json 형태 데이터 보내기

이 Post 는 Get 과 다르게 데이터를 받아오는게 아님

POST 랑 PUT 은 데이터를 더 추가 or 변경해달라고 값까지 요청해야 하는거임

 

Put 은 이름값 까지 줘야함

 

HttpManager ---> Send() 부분

주석 처리된 string 을 넣으면 들어감!

이렇게 POST 부분에는 URL 과, 우리가 보내고싶은 부분이 추가되야 함

 

HttpRequester 에서 클래스를 만들자!

우리가 보내고 싶은 Key Value 들
여기에서 postData 도 넣어줘야함!

body에다가 정보를 넣어서 보내주세요~ 라고도 함

, 우리가 추가해서 넣어주고싶은 string 임!

이름을 postData 라고 한건 지금 Post 를 하고있기 때문에 변수명을 저렇게 해준거임

 

PUT 같은경우도 이렇게 씀
requester 의 타입에 따라 달라지는 요청방식과 parameter 들

 

UIManager 로 와서 

또 한세트 복붙 해서 수정해보자!

이제 회원가입을 하면,

 

POST 형식으로 

UserData 의 값 들을 넣는거임!

 

시험삼아 우리가 Json 으로 보내는 형식으로

print 해봤는데 

이렇게 뜬다!

이건 이제 우리가 보내는 방식임!

'Network' 카테고리의 다른 글

네트워크 Json 첫날(인적사항, 오브젝트 불러오기)  (0) 2022.08.30