【问题标题】:JSON Post method is not working swiftJSON Post 方法无法快速运行
【发布时间】:2018-05-27 17:35:11
【问题描述】:

我正在快速解析来自 google maps api 的 json 数据,正在尝试使用 google maps api 显示当前位置,使用 didUpdateLocations 获取当前位置的纬度和经度。在 serviceLocationupdate() 内部 使用 post 方法发布 lat 和 long 值,但没有得到 json 的响应。如何从 json 获取响应(数据)。

这是代码

var lat  = ""
var long = ""
var latlng:String = ""


         func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

                let location:CLLocationCoordinate2D = manager.location!.coordinate
                self.lat = String(location.latitude)
                self.long = String(location.longitude)
                latlng = self.lat+"," + self.long


}



func serviceLocationupdate()
        {

            var request = URLRequest(url: URL(string: "http://maps.googleapis.com/maps/api/geocode/json")!)

     let session = URLSession.shared

            request.httpMethod = "POST"

      ----->> let bodyData = "latlng=\(latlng)&sensor=\("true")"

            print("bodydata",bodyData)

            request.httpBody = bodyData.data(using: String.Encoding.utf8);


            let task = session.dataTask(with:request,completionHandler:{(d,response,error)in

                do{


                    if let data = d{
                        do{
                            let jsonResult = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary
                            if let results = jsonResult["results"] as? [[String : AnyObject]] {

                                for result in results{

                                    if let addressComponents = result["address_components"] as? [[String : AnyObject]] {

                                        print(addressComponents)
                                    }
                                }
                            }

                        } catch
                        {

                        }

                    }

            }
            })

            task.resume()
        }

如果我可以使用这个 api,它工作正常,可以得到正确的数据

var request = URLRequest(url: URL(string:"http://maps.googleapis.com/maps/api/geocode/json?latlng=13.026811,77.593773&sensor=true")!)

我想用经纬度显示当前位置

【问题讨论】:

    标签: ios json swift google-maps


    【解决方案1】:

    看起来 API 适用于您提到的网址 (http://maps.googleapis.com/maps/api/geocode/json?latlng=13.026811,77.593773&sensor=true),那么您可以使用 GET 而不是 POST。请尝试以下操作:

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    
                let location:CLLocationCoordinate2D = manager.location!.coordinate
                self.lat = String(location.latitude)
                self.long = String(location.longitude)
                latlng = self.lat+","+self.long
                serviceLocationupdate()
    }
    
    func serviceLocationupdate()
        {
    
            var request = URLRequest(url: URL(string: "http://maps.googleapis.com/maps/api/geocode/json?latlng=\(latlng)&sensor=true")!)
    
            let task = session.dataTask(with:request,completionHandler:{(d,response,error)in
    
                    if let data = d{
                        do{
                            let jsonResult = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary
                            if let results = jsonResult["results"] as? [[String : AnyObject]] {
    
                                for result in results{
    
                                    if let addressComponents = result["address_components"] as? [[String : AnyObject]] {
    
                                        print(addressComponents)
                                    }
                                }
                            }
    
                        } catch
                        {
    
                        }
    
                    }
            })
    
            task.resume()
        }
    

    【讨论】:

      【解决方案2】:

      这适用于游乐场:

      //: Playground - noun: a place where people can play
      
      import UIKit
      import XCTest
      import PlaygroundSupport
      
      PlaygroundPage.current.needsIndefiniteExecution = true
      
      func serviceLocationupdate()
      {
          let session = URLSession.shared
          if let url = URL(string: "http://maps.googleapis.com/maps/api/geocode/json"),
              var params = URLComponents(url: url, resolvingAgainstBaseURL: false) {
      
              params.queryItems = [URLQueryItem]()
              params.queryItems?.append(URLQueryItem(name: "latlng", value: "33.9250675,-84.339827"))
              params.queryItems?.append(URLQueryItem(name: "sensor", value: "true"))
      
              guard let finalURL = params.url else {
                  print("Failed to create URL")
                  return
              }
              var request = URLRequest(url: finalURL)
              request.httpMethod = "POST"
      
              let task = session.dataTask(with:request,completionHandler:{(data,response,error)in
      
                  if let error = error {
                      print("Error is \(error)")
                      return
                  }
      
                  if let resp = response as? HTTPURLResponse {
                      print("Response status code \(resp.statusCode)")
      
                      guard let data = data else {
                          return
                      }
      
                      do {
                          if let jsonResult = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary,
                              let results = jsonResult["results"] as? [[String : AnyObject]] {
      
                              for result in results {
                                  if let addressComponents = result["address_components"] as? [[String : AnyObject]] {
                                      print(addressComponents)
                                  }
                              }
      
                          } else {
                              print("Could not coerce into a dictionary")
                          }
                      } catch _ {
                          print("An error occurred")
                      }
      
      
                  } else {
                      print("Invalid response")
                  }
              })
              task.resume()
          }
      }
      
      serviceLocationupdate()
      

      【讨论】:

        猜你喜欢
        • 2017-10-02
        • 1970-01-01
        • 1970-01-01
        • 2017-04-02
        • 1970-01-01
        • 1970-01-01
        • 2015-02-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多