Swift에서 httprequest를 통한 지역검색시 값이 안나옵니다

예전에 되었는데…뭔가 제가 바꾼건지…왜 빈값이 나오는건지 이해가 안가네요
일단 200 코드는 잘 뜹니다.

var daumcomponents = URLComponents(string: "https://dapi.kakao.com/v2/local/search/keyword.json")!
    let headers = ["Authorization":"KakaoAK RESTAPI"]
    
    let parameters = ["x": "37.489517", "y":"127.031605","radius":"20000","query":"카카오프렌즈"]

    
    var queryItems = [URLQueryItem]()
    for (key, value) in parameters {
        queryItems.append(URLQueryItem(name: key, value: value))
    }
    daumcomponents.queryItems = queryItems

    var request = URLRequest(url: (daumcomponents.url)!)
    
    for (key, value) in headers {
        request.value(forHTTPHeaderField: key)
        request.setValue(value, forHTTPHeaderField: key)
    }

위와같이 잘 헤더값/패러미터를 넣어줍니다.

let task = URLSession.shared.dataTask(with: request) { data, response, error in
            guard let data = data, let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200, error == nil else {
                print("success")
                print(String(describing: response))
                print(String(describing: error))
                return
            }
        
        print("start")
        print(data).   
        print("response:")
        print(response)
        print(error)
        print("end")


guard let json = try! JSONSerialization.jsonObject(with: data) as? [String: Any] else {
                print("not JSON format expected")
                print(String(data: data, encoding: .utf8) ?? "Not string?!?")
                return
            }

위에서 data값에 json으로 결과값이 리턴되어서 그걸 json으로 만들어서 아래와 같이 각각의 리턴 값을 처리해주는 코드입니다.

 guard let results = json["documents"] as? [[String: Any]] else {return}
            
            for result in results{
               
                let resultvalue = (result["distance"] as! NSString).intValue
   .............

로그를 보면 위의 start 찍힌부분부터 아래와 같습니다.
start
152 bytes
response:
Optional(<NSHTTPURLResponse: 0x1c0a397a0> { URL: https://dapi.kakao.com/v2/local/search/keyword.json?x=37.489517&radius=20000&query=카카오프렌즈&y=127.031605 } { status code: 200, headers {
“Access-Control-Allow-Headers” = “Authorization, KA, Origin, X-Requested-With, Content-Type, Accept”;
“Access-Control-Allow-Methods” = “GET, OPTIONS”;
“Access-Control-Allow-Origin” = “*”;
“Cache-Control” = “no-cache, no-store, max-age=0”;
Connection = “keep-alive”;
“Content-Encoding” = gzip;
“Content-Language” = “ko-KR”;
“Content-Type” = “application/json;charset=UTF-8”;
Date = “Thu, 21 Dec 2017 08:04:12 GMT”;
Expires = “Thu, 01 Jan 1970 00:00:00 GMT”;
Pragma = “no-cache”;
Server = nginx;
“Transfer-Encoding” = Identity;
Vary = “Accept-Encoding”;
“X-Request-Id” = “87ed1710-e625-11e7-abf6-cb93d4ce0014”;
} })
nil
end

error는 나지않았고 data, response에 위와같은 값이 들어있네요…
뭐가 문제일까요? ㅜㅠ

감사합니다.

@kotran
curl로 해보셔도 body가 없나요?

@kotran
앗 제가 글을 잘못 읽었네요…
data를 JSON object로 변환해서 출력해보세요~

1개의 좋아요

답변감사합니다.

guard let json = try! JSONSerialization.jsonObject(with: data) as? [String: Any] else {

                print("not JSON format expected")
                print(String(data: data, encoding: .utf8) ?? "Not string?!?")
                return
            }

이부분에서 json object화 된거아닌가요~??

위와같이 한후, json을 찍어보면

[“documents”: <__NSArray0 0x1c001ec90>(

)
, “meta”: {
“is_end” = 1;
“pageable_count” = 0;
“same_name” = {
keyword = “\Uce74\Uce74\Uc624\Ud504\Ub80c\Uc988”;
region = (
);
“selected_region” = “”;
};
“total_count” = 0;
}]
이렇게 나옵니다.

@kotran
아 또 글을 보다 말았네요…ㅠ
밑에서 JSON 변환을 시도하셨었군요~
json을 출력해보시겠어요?

1개의 좋아요

바로 위에 올렸어요 로그값 ㅎㅎ 바쁘실텐데 답변 감사해요

@kotran
일단 정상적인 응답이 내려간것 같은데요~
나머지는 작성하신 코드의 디테일에 달린 부분이라 크게 코멘트 드릴부분은 없는것 같고
data 를 그대로 string으로 변환해서 살펴보시면 디버깅에 도움이 될 것 같습니다
살펴보신 후에 저희 스펙에 맞지 않는 부분 있으면 추가 질문 부탁드릴게요~

1개의 좋아요

“meta”: {
“is_end” = 1;
“pageable_count” = 0;
“same_name” = {
keyword = “\Uce74\Uce74\Uc624\Ud504\Ub80c\Uc988”;
region = (
);
“selected_region” = “”;
};
“total_count” = 0;
}])

이게 data를 찍어본건데요…
document가 보여야하는데 보이지 않는게 문제네요…흠…

정상 리턴은 아래와같습니다

“meta”: {
“same_name”: {
“region”: [],
“keyword”: “카카오프렌즈”,
“selected_region”: “”
},
“pageable_count”: 4,
“total_count”: 4,
“is_end”: true
},
“documents”: [
{
“place_url”: “http://place.map.daum.net/26338954”,
“category_group_name”: “”,
“place_name”: “카카오프렌즈 코엑스점”,
“distance”: “418”,
“address_name”: “서울 강남구 삼성동 159”,
“road_address_name”: “서울 강남구 영동대로 513”,
“id”: “26338954”,
“phone”: “02-6002-1880”,
“category_group_code”: “”,
“category_name”: “가정,생활 > 문구,사무용품 > 디자인문구 > 카카오프렌즈”,
“x”: “127.05902969025047”,
“y”: “37.51207412593136”
},

키워드가…저렇게나오는게 정상인가요? 카카오프렌즈인데…

@kotran
NSDictionary 객체를 그대로 출력하시면 한글은 저렇게 유니코드화 되어서 출력됩니다.
data를 JSONObject가 아닌 String으로 변환해서 출력하면 보이실거에요~

1개의 좋아요

스트링으로 변환하라는게…스트링으로 캐스팅하라는말씀이신가요?
그냥 data를찍으면 바이트 수만 나오던데…Optional(152 bytes) 이런식으로요.

print("data to string")
            let a = String(describing: data)
            print(a)

위와같이 스트링으로 변환하면
결과로 옵셔널만 벗겨진 152bytes가 찍힙니다.

유니코드랑 상관없어보이는게…starbucks 를 쿼리 키워드로 해서 포스트맨에 검색해보면 잘나와서 코드에서도 starbucks로 해봐도 json 결과값은

[“documents”: <__NSArray0 0x1c001ea10>(

)
, “meta”: {
“is_end” = 1;
“pageable_count” = 0;
“same_name” = {
keyword = starbucks;
region = (
);
“selected_region” = “”;
};
“total_count” = 0;
}]

is_end는 왜 1인지…블리언 값인데…

오마이갓. x, y 를 반대로적었네요

참고하세요 코드는~~~

감사합니다 답변 :slight_smile: