gpt4 book ai didi

ios - AFNetworking 2.0 中的 Web 服务调用问题

转载 作者:行者123 更新时间:2023-11-28 08:59:17 24 4
gpt4 key购买 nike

我在 swift 中使用 AFNetworking 2.0 进行调用api如下 http://api.openweathermap.org/data/2.5/weather?q=Delhi

当我们在浏览器上点击这个 URL 时,我们将得到一个 JSON。这是一个 GET 请求。在 postman 上点击这个 api 也会产生相同的结果现在我制作了一个帮助程序类 WebService.swift 并在其中调用了一个成功 block 和一个错误 block

我的WebService.swift类如下

import UIKit

class WebService: NSObject {

static let sharedInstance = WebService()


func weatherService(loginCode:String, requestData:NSMutableDictionary, successBlock: (response: AnyObject!,headers: NSDictionary, callBack:String ) -> Void, errorBlock: (error: NSError,headers:NSDictionary,responseObject:AnyObject!) -> Void){

var serviceURL = "http://api.openweathermap.org/data/2.5/weather?q=Delhi"
var manager = AFHTTPRequestOperationManager()
manager.requestSerializer = AFJSONRequestSerializer()

manager.responseSerializer.acceptableContentTypes = NSSet(objects: "text/html","application/json") as? Set<NSObject>


manager.requestSerializer.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")

manager.GET(serviceURL, parameters: requestData, success: { (operation:AFHTTPRequestOperation, responseObject:AnyObject) -> Void in
var headersCollection = operation.valueForKey("response")?.valueForKey("allHeaderFields") as! NSDictionary
var headers = headersCollection.mutableCopy() as! NSMutableDictionary
headers["statusCode"] = NSNumber(integer: operation.response!.statusCode)
var _callBack = requestData["callBack"] as! String
successBlock(response:responseObject,headers:headers,callBack: _callBack)


}) { (operation:AFHTTPRequestOperation, error:NSError) -> Void in


var headersCollection = operation.valueForKey("response")?.valueForKey("allHeaderFields") as! NSDictionary
var headers = headersCollection.mutableCopy() as! NSMutableDictionary
headers["statusCode"] = NSNumber(integer: operation.response!.statusCode)

errorBlock(error: error, headers: headers, responseObject: operation.responseObject)
}


}

}

我从 View 中的 View Controller 调用的方法确实加载了

        let params = ["callBack": String(format: "%d", "weatherAPI")] as NSMutableDictionary

WebService.sharedInstance.weatherService("URLHardcodedInWebServiceClass", requestData: params, successBlock: { (response, headers, callBack) -> Void in

var dict = response as! NSDictionary


println("Success with \(callBack)")

}) { (error, headers, responseObject) -> Void in

println("failed")

}

现在的问题是,每次我进入 webservice 类的错误 block 时,标题的内容是 NSMutableDictionary 是

{
"Access-Control-Allow-Credentials" = true;
"Access-Control-Allow-Methods" = "GET, POST";
"Access-Control-Allow-Origin" = "*";
Connection = "keep-alive";
"Content-Type" = "application/json; charset=utf-8";
Date = "Mon, 31 Aug 2015 18:53:36 GMT";
Server = nginx;
"Transfer-Encoding" = Identity;
"X-Source" = back;
statusCode = 200;
}

当我看到它显示的 NSError 时

打印错误说明:

Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" 
(JSON text did not start with array or object and option to allow fragments not set.)
UserInfo=0x7fdb6865d5a0 {NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}

我收到的状态代码是 200当我这样做时po operation.responseString 我明白了 enter image description here

json 在那里,但有错误,我猜它的格式不正确。我尝试了我的其他服务,内容类型为 text/html,它工作正常,因为我必须更改行

manager.requestSerializer.setValue("text/html; charset=utf-8", forHTTPHeaderField: "Content-Type")

其他服务的 URL 是 http://bluesapphireindia.in/WebService.asmx/GetEmployessJSON

这段代码运行良好

可能是什么原因。谁能帮我解决这个问题。谢谢

最佳答案

我在当前项目中以不同的方式完成了同样的事情,方法是在 Swift 中使用 AFNetworking 中的 AFHTTPRequestOperation 类。希望对您有所帮助。

 func afnStartConnectionWithURL(urlEndPoint: String, enumName: enumAPIname, httpMethod: String, httpBody: AnyObject, headerValue: String){

var _URL = NSURL(string: kBaseURL + urlEndPoint)
var currentTime: NSTimeInterval = 10

var request = NSMutableURLRequest(URL: _URL!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData, timeoutInterval: currentTime)
request.HTTPMethod = httpMethod
var err: NSError?
if(httpMethod == kPOST){

let jsonData:NSData = NSJSONSerialization.dataWithJSONObject(httpBody, options: .PrettyPrinted, error: nil)!
request.HTTPBody = jsonData
}
request.addValue(headerValue, forHTTPHeaderField: "Authorization")
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")

var op = AFHTTPRequestOperation(request: request)
op.responseSerializer = AFJSONResponseSerializer()
op.setCompletionBlockWithSuccess({ (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) -> Void in

operation.cancel()
var dicConnectionResponse:NSDictionary = responseObject as! NSDictionary
self.afnConnection_Result(dicConnectionResponse, enumName: enumName, afhttpRequestOperation: operation)

},

failure: { (operation: AFHTTPRequestOperation!, error:NSError!) -> Void in

operation.cancel()
self.afnConnection_Error(operation, enumName: enumName, error: error)
})

op.start()
}

这里的 afnConnection_ResultafnConnection_Error 是回调委托(delegate)方法。

关于ios - AFNetworking 2.0 中的 Web 服务调用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32318184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com