IOS/프로젝트

앱 개발 기록 5. Alamofire

_IGHT 2021. 3. 3. 03:33

 

 

 

Alamofire는 iOS의 REST API 통신을 지원해주는

라이브러리이다.

 

 

 

기본 Url 뒤에는 ?을 사용하여 기본인자 정보들을 적고, 
기본인자사이에는 &을 붙여 구분지어준다.
그러나 제공하는 api마다 상세한 방식은 다를 수 있으니, doc을 꼭 읽어봐야 한다.

 

 

ex: 

api.openweathermap.org/data/2.5/weather?id=1835847&appid=b39aeb1e660919371efad86125f1a70d&units=metric&lang=kr

 

api.openweathermap.org/data/2.5/weather (기본 URL)

? (기본URL과 기본인자를 구분하기 위한 특수문자)

id=1835847 (기본 인자)

& (기본인자를 구분하기 위한 특수문자)

appid=b39aeb1e660919371efad86125f1a70d&units=metric (기본 인자)

& (기본인자를 구분하기 위한 특수문자)

lang=kr (기본 인자)

 

-URL
https://honggun-blog.herokuapp.com/READ_CONTENTS

-파라미터
JOB: 직업(String)

-메서드
POST

-반환값
JSON


//접근하고자 하는 URL 정보
let URL = "https://honggun-blog.herokuapp.com/READ_CONTENTS"

//전송할 파라미터 정보
let PARAM:Parameters = [
    //"축구선수" 혹은 "영화배우"를 넣어주세요.
    "JOB": "영화배우"
]

//위의 URL와 파라미터를 담아서 POST 방식으로 통신하며, statusCode가 200번대(정상적인 통신) 인지 유효성 검사 진행
let alamo = AF.request(URL, method: .post, parameters: PARAM).validate(statusCode: 200..<300)

//결과값으로 JSON을 받을 때 사용
alamo.responseJSON() { response in
    switch response.result
    {
    //통신성공
    case .success(let value):
        
        if let jsonObj = value as? [Dictionary<String, Any>]
        {
            //JSON 배열의 갯수
            print("데이터의 갯수: \(jsonObj.count)")
            
            for item in jsonObj
            {
                print("\n--------------------------------------------")
                //JSON 배열의 n번째 값
                print("item: \(item)")
                
                //JSON의 단일 값 접근
                let NAME = item["NAME"]! as? String ?? ""
                let BORN = item["BORN"]! as? Int ?? 0
                let JOB = item["JOB"]! as? String ?? ""
                
                print("NAME: \(NAME)")
                print("BORN: \(BORN)")
                print("JOB: \(JOB)")
            }
        }
        
    //통신실패
    case .failure(let error):
        print("error: \(String(describing: error.errorDescription))")
    }
}
[출처] 스위프트[Swift] - Alamofire 사용법|작성자 홍군

blog.naver.com/PostView.nhn?blogId=traeumen927&logNo=221839041804&categoryNo=0&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=postView

alamofire 사용방법 예시이다.

 

JSON을 하나하나 까서 받아온 데이터를 파싱해도 되지만

 

좀 더 편리한 방법으로 codable 프로토콜을 사용하는 방법이 있다.

 

 

leejigun.github.io/JSON_parsing_using_Codable

 

Codable을 사용한 JSON 데이터 파싱

이번 포스트에서는 Swift4에서 추가된 Codable 프로토콜을 사용해 JSON 데이터를 처리하는 방법을 알아보겠습니다. 과거 제가 처음으로 iOS를 공부할 때에는 JSONSerialization 을 사용한 방법이 책에 나와

leejigun.github.io

 

 

Codable이 추가된 이후에 JSON 데이터 파싱을 위한 코드.

 

let decoder = JSONDecoder()
do {
    let todo = try decoder.decode(Todo.self, from: responseData)
    completionHandler(todo, nil)
} catch {
    print("error trying to convert data to JSON")
    print(error)
    completionHandler(nil, error)
}

 

자동으로 JSON Data를 Todo 구조체로 맵핑하는 동작을 수행합니다.

구조체마다 생성자를 사전에 만들 필요가 없기 때문에 코드도 짧아지고 코딩 시간도 줄었습니다.

 

 

zeddios.tistory.com/373

 

Swift ) 왕초보를 위한 Codable / JSON Encoding and Decoding

안녕하세요 :) Zedd입니다. < 최신버전 확인하기 / App Udpate >글쓰다가 갑자기 Codable 개삘 Swift4가 나오기전에, JSON 파싱이 Swift4에서는 한줄로 끝난단다 하는 유튜브 영상을 봐서 오옷했던 기억이 있

zeddios.tistory.com

 

받아온 JSON 파일을 디코딩하기 위한 코드이다.

 


struct Person : Codable{
	
    var name : String
    
    var age : Int
    
}


let jsonString = """

{



"name" : "Zedd",



"age" : 100



}

"""





let decoder = JSONDecoder()

var data = jsonString.data(using: .utf8)

if let data = data, let myPerson = try? decoder.decode(Person.self, from: data) {

    print(myPerson.name)//Zedd

    print(myPerson.age)//100

}



출처: https://zeddios.tistory.com/373 [ZeddiOS]

 

www.hackingwithswift.com/read/7/3/parsing-json-using-the-codable-protocol

 

Parsing JSON using the Codable protocol - a free Hacking with Swift tutorial

Was this page useful? Let us know! 1 2 3 4 5

www.hackingwithswift.com

codable 프로토콜을 이용하여 JSON을 파싱하는 방법을 설명한 사이트이다.

 

 

 

 

 

nsios.tistory.com/22

 

[Swift] Alamofire를 사용하여 API JSON 데이터 받기 (2/2)

+ 2020.05.18 2020/05/18 - [iyOmSd/Title: Swift] - [Swift] - Alamofire 5.1 변경된 통신 및 Json Dynamic Key 이전글에서는 [Swift] Alamofire를 사용하여 API JSON 데이터 받기 (1/2) Alamofire과 URLSession..

nsios.tistory.com

 

 

Alamofire과 URLSession을 이용한 통신

NS자료형을 이용한 파싱과 JSONDecoder을 이용한 파싱을 해봤어요!!

 

이번에도 라이브러리는 CocoaPods을 통해서 받아올거에요

https://github.com/SwiftyJSON/SwiftyJSON

 

작성일을 기준으로

pod 'SwiftyJSON', '~> 4.0'

를 하면 된다고 하네요!! 

 

버전이 업데이트 될 수 있어서 안먹히는 경우도 많으니까

작성일을 잘 확인해주세요

 

전 게시물에서 Alamofire의 POST통신 형식만 확인했고

GET형식을 하지않았는데 이번에는

GET형식으로 통신하는 코드로 해볼게요

 

 

 

라이브러리를 사용해서 간단하게 JSON을 파싱하는방법

 

import Foundation
import Alamofire
import SwiftyJSON

struct CheckIdService {
    private init() { }
    static let shared = CheckIdService()
    
    let header: HTTPHeaders = [
        "Content-Type" : "application/json"
    ]
    
    func getCheckIdResult(userid: String, completion: @escaping (_ b: Bool) -> Void) {
        
        let url = DanBeeAPI.checkIdURL+"\(userid)"
        
        Alamofire.request(url).responseJSON {
            response in
            
            switch response.result {
            case .success(let value):
                let json = JSON(value)
                let result = json["result"].intValue
                if result == 404 {
                    completion(true)
                }else {
                    completion(false)
                }
                
            default:
                return
            }
        }
    }
}

되게 코드량도 적고 간결해 보이죠??

 

GET통신을 할때는 

POST통신을 할때는 

아무래도 POST는 이것저것 많이들어가다보니 길어질 수도 있고

제가 비효율적인 방법을 사용 했을수도있어요....ㅠ

 

 

쓰는 방법은 마찬가지로 result에는

라이브러리 내장 성공코드가 포함되어있어서

그값을 이용해서 실패와 성공인 경우를 나누면 되요

 

이제 그뒤에 SwiftyJSON을 사용해볼거에요

 

JSON()

를 이용해서 파싱 받을수 있어요

value에는 JSON형식의 데이터가 들어있어요

JSON()을 이용해서 파싱해준 변수 json에는

key 와 value 형태인 Dictionary형 변수가 저장되요

 

key값으론 JSON의 key값이 될거에요

여기서는 [result : Int] 식의 데이터이기때문에

.intValue를 통해서 int 데이터를 받아서 result변수에 저장했어요

 

 

저번에 했던 JSON형식처럼 복잡한 형태라면

 

JSON에서 data는 Array로 존재하므로

arrayValue로 파싱받는데

서버에서 해당되는 값은 1개만 들어오도록 되어있어서

인덱스 0값을 가져올거에요

 

가져오면

id

type

del_yn

name

phone

.

.

.

다양한 키값들을 통해서 데이터를 파싱 할 수 있어요

 

 

통신 끝!!

 

 

더 좋은 방법도 있을 거에요

항상 이 코드만이 답이 아니에요!!

 

이제 통신 정도는 가뿐ㅎ...하...ㄱ...ㅔ..



출처: https://nsios.tistory.com/22 [NamS의 iOS일기]

 

 

 

 

 

728x90