꾸준히 안타치기
URL encoding , 한글인코딩 본문
반응형
검색기능을 만들었는데 영어, 숫자만 검색되고 한글은 검색결과가 나오지 않았다.
문제) URL세션으로 API 검색기능을 구현함 -> 한글검색은 안되는 상태. url에 한글이 포함되어 있을 경우에 서버는 한글을 읽을수 없다. 띄어쓰기도 인식X
해결) addingPercentEconding과 urlQueryAllowed 사용해서 URL String을 -> String으로 변경해 전송
인코딩후 서버로 전송한다.
// word에 담긴 단어를 가져옴
print("firstTabVC/ 단어입력내용 :\(self.word)")
// 한글이 있는 URL
let someURLString = self.BASEURL+"post/0iOS_feedSearch.php?word=\(word)"
// 한글이 있는 URL String을 addingPercentEncoding으로 string으로 변경한다.(urlQueryAllowed를 사용)
let result = someURLString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
// URL인코딩
var components = URLComponents(string: result!)
// 결과(http://0.00.00.000/post/0iOS_feedSearch.php?word=%25ED%2595%2598)
print(components)
전체코드
더보기
// 검색요청 API
func searchWord(success: (()->Void)? = nil, fail: ((String)->Void)? = nil) {
// 검색창에 작성한 단어
print("firstTabVC/ 단어입력내용 :\(self.word)")
// word에 담긴 단어를 가져옴
// URL세선 시작
let sessionConfig = URLSessionConfiguration.default
let session = URLSession(configuration: sessionConfig)
// 한글이 있는 URL
let someURLString = self.BASEURL+"post/0iOS_feedSearch.php?word=\(word)"
// 한글이 있는 URL String을 addingPercentEncoding으로 string으로 변경한다.(urlQueryAllowed를 사용)
let result = someURLString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
// 컴포넌트에 남아서 보내기
var components = URLComponents(string: result!)
print(components)
// 결과(http://0.00.00.00/post/0iOS_feedSearch.php?word=%25ED%2595%2598)
let word = URLQueryItem(name: "word", value: word)
components?.queryItems = [word]
// url이 없으면 리턴한다. 여기서 끝
guard let url = components?.url else { return }
// 값이 있다면 받아와서 넣음.
var request = URLRequest(url: url)
request.httpMethod = "GET"
let task = session.dataTask(with: request) { data, response, error in
print( (response as! HTTPURLResponse).statusCode )
// 데이터가 있을때만 파싱한다.
if let hasData = data {
// 모델만든것 가져다가 디코더해준다.
do{
// 만들어놓은 피드모델에 담음, 데이터를 디코딩해서, 디코딩은 try catch문 써줘야함
// 여기서 실행을 하고 오류가 나면 catch로 던져서 프린트해주겠다.
self.feedModel = try JSONDecoder().decode(FeedModel.self, from: hasData)
print(self.feedModel ?? "no data")
// 모든UI 작업은 메인쓰레드에서 이루어져야한다.
DispatchQueue.main.async {
// 테이블뷰 갱신
self.tableView.reloadData()
}
} catch {
print("error: ", error)
}
}else{
// sucess가 0이면
self.isCalling = false
self.alert("좋아요업로드 응답실패")
}
}
// task를 실행한다.
task.resume()
// 세션끝내기
session.finishTasksAndInvalidate()
}//함수 끝
참고한예제 ) addingPercentEconding과 urlQueryAllowed 사용하여 시도 (?를 포함해야 되므로)
- 한글이 있는 url string을 percent encdoing으로 string 변경
let someURLString = "https://ios-development.tistory.com/search?keyword=검색단어" let result = someURLString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) print(result) // Optional("https://ios-development.tistory.com/search?keyword=%EC%B5%9C%EC%8B%A0%EA%B8%B0%EC%88%A0")
- URL 인코딩
let url = URL(string: result!) print(url) // https://ios-development.tistory.com/search?keyword=%EC%B5%9C%EC%8B%A0%EA%B8%B0%EC%88%A0
CharacterSet
각 Set 별로 알파벳, 숫자 외에 포함할 수 있는 특수문자의 목록. 여기에 포함되지 않는 문자는 encoding이 되어서 변환된다.
- urlQueryAllowed
! $ & \ ( ) * + - . / : ; = ? @ _ ~
- urlPathAllowed
! $ & \ ( ) * + - . / : = @ _ ~
인코딩 Set종류 / CharacterSet에 정의된 문자들은 encoding되는게 아닌 키워드로 인식하라는 의미
참고 https://ios-development.tistory.com/880
https://developer.apple.com/documentation/foundation/characterset#2902136
반응형
'iOS > 문제해결' 카테고리의 다른 글
NotificationCenter를 사용해 새로고침, 여러번 호출되는 문제해결 (0) | 2022.06.09 |
---|---|
페이징을 왜 써야할까? (0) | 2022.06.09 |
애플의 iOS 리뷰 가이드라인 (0) | 2022.05.26 |
AWS EC2 프리티어 비용관련 설정 문제 (0) | 2022.05.16 |
클라이언트와 서버에서 좋아요의 처리는? (2) | 2022.05.14 |
Comments