Estoy tratando de conseguir una respuesta JSON mediante el uso de Swift.

Que olfateó la solicitud y la respuesta -> todo ok. Sin embargo, el valor de retorno es siempre nil.

let httpClient = AppDelegate.appDelegate().httpRequestOperationManager as AFHTTPRequestOperationManager;

let path = "/daten/wfs";
let query = "?service=WFS&request=GetFeature&version=1.1.0&typeName=ogdwien:AMPELOGD&srsName=EPSG:4326&outputFormat=json".stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding);

func successBlock(operation: AFHTTPRequestOperation!, responseObject: AnyObject!) {
    println("JSON: " + "\(responseObject)")
}

func errorBlock(operation: AFHTTPRequestOperation!, error:NSError!) {
    println("Error: " + error.localizedDescription)
}

let urlString = "\(path)" + "/" + "\(query)"
println("urlString: " + httpClient.baseURL.absoluteString + urlString)

Yo también lo he probado de esta manera:

httpClient.GET(urlString, parameters: nil,
    success: { (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) -> Void in
        println("Success")
        println("JSON: " + "\(responseObject)")
    },
    failure:{ (operation: AFHTTPRequestOperation!, error:NSError!) -> Void in
        println("Failure")
    })

… Pero la responseObject siempre parece ser nil

EDICIÓN:

Tal vez la razón es el posible mal de inicialización en mi AppDelegate:

var httpRequestOperationManager: AFHTTPRequestOperationManager? //JAVA SERVER Client

class func appDelegate() -> AppDelegate {
    return UIApplication.sharedApplication().delegate as AppDelegate
}

func configureWebservice() {
    let requestSerializer = AFJSONRequestSerializer()
    requestSerializer.setValue("1234567890", forHTTPHeaderField: "clientId")
    requestSerializer.setValue("Test", forHTTPHeaderField: "appName")
    requestSerializer.setValue("1.0.0", forHTTPHeaderField: "appVersion")

    let responseSerializer = AFJSONResponseSerializer()

    AFNetworkActivityIndicatorManager.sharedManager().enabled = true

    //##### HTTP #####
    let baseURL = NSURL(string: "http://data.wien.gv.at");
    httpRequestOperationManager = AFHTTPRequestOperationManager(baseURL: baseURL))

    httpRequestOperationManager!.requestSerializer = requestSerializer
    httpRequestOperationManager!.responseSerializer = responseSerializer
}

Alguna sugerencia de qué estoy haciendo mal?

  • Le recomiendo que use Alamofire en lugar de AFNetworking. Es el sucesor de AFNetworking completamente reescrito en y para Swift.
InformationsquelleAutor user707342 | 2014-06-05

3 Comentarios

  1. 8

    Swift es totalmente compatible con el código Objective-C, por lo que su problema es no conectado con Swift sí mismo. En AFNetworking, el responseObject puede a veces se nil. Esto incluye los casos, donde:

    • Un 204 No Content código de estado fue devuelto,
    • Si el flujo de salida se fijó para escribir el archivo,
    • Si el error durante la validación no NSURLErrorCannotDecodeContentData (por ejemplo, inaceptable tipo de contenido)

    Retirar #740 y #1280 para obtener más información.

    • Gracias por la sugerencia … parece que mi base de inicialización está mal. Todavía no he descubierto por qué. Puedo agregar la información a mi post original
    • Es un servidor relacionadas con el tema -> traté de otra URL y funcionó. Gracias!
  2. 6

    Puede utilizar Swift interoperabilidad con Objective-C marcos, pero ahora no es un funcionario de la biblioteca, vamos a echarle un vistazo:

    https://github.com/Alamofire/Alamofire

    Esta biblioteca está escrito en el nativo de Swift, desde el creador de AFNetworking. Usted probablemente tendrá que buscar este tipo de cosas cuando se mueve a Swift. He probado y es impresionante, al igual que su predecesor.

  3. -1
    HttpManager.sharedInstance.getNewestAppList("\(self.numberofPhoto)", offset: "0", device_type: "ios",search: self.strSearch, filter: self.strFilter, onCompletion: { (responseObject: NSDictionary?, error: NSError?) -> Void in
        if error != nil {
            SwiftLoader.hide()
            self.showAlertWithMessage("\(error!.localizedFailureReason!)\n\(error!.localizedRecoverySuggestion!)")
        } else {
            SwiftLoader.hide()
    
            if responseObject!.valueForKey("status") as! NSString as String == "0" {
                self.showAlertWithMessage(responseObject!.valueForKey("message") as! NSString as String)
            } else {
                self.itemsArray =  responseObject!.valueForKey("data") as! NSArray
                print(self.itemsArray.count)
                self.tableCategoryDetailRef.reloadData()
            }
        }
    })

    import Foundation
    typealias getResponse = (NSDictionary?, NSError?) -> Void
    class HttpManager: NSObject {
    var AFManager: AFURLSessionManager?
    var strUrl: NSString = "url"
    class var sharedInstance:HttpManager {
    struct Singleton {
    static let instance = HttpManager()
    }
    return Singleton.instance
    }
    //MARK: - Method
        func getCount(device_type:String, onCompletion: getResponse) -> Void {
    let post: String = "device_type=\(device_type)"
    let postData: NSData = post.dataUsingEncoding(NSASCIIStringEncoding, allowLossyConversion: true)!
    let postLength:NSString = String(postData.length)
    let configuration: NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()
    AFManager = AFURLSessionManager(sessionConfiguration: configuration)
    let URL: NSURL = NSURL(string: "\(strUrl)/count" as String)!
    let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: URL)
    urlRequest.HTTPMethod = "POST"
    urlRequest.setValue(postLength as String, forHTTPHeaderField: "Content-Length")
    urlRequest.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    urlRequest.HTTPBody = postData
    let task =  AFManager?.dataTaskWithRequest(urlRequest) { (data, response, error) in
    if response == nil {
    SwiftLoader.hide()
    } else {
    let responseDict:NSDictionary = response as! NSDictionary
    onCompletion(responseDict,error)
    }
    }
    task!.resume()
    }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here