【问题标题】:Sending http request with swift使用 swift 发送 http 请求
【发布时间】:2016-02-26 15:21:02
【问题描述】:

我正在尝试使用 swift 向 PHP 服务器发送一个 http 请求。我设法发送数据并读取服务器的响应。我只希望我的 php 服务器根据 json 请求中存在的请求类型执行不同的操作

这是我发送请求的方法:

func sendHttpRequests(data : Dictionary<String, AnyObject>) //-> NSDictionary
{
    let url = NSURL ( string : "http://aaa.bbb.ccc.ddd")!
    let request:NSMutableURLRequest = NSMutableURLRequest(URL : url)

    let payload1 = "\"r\":\"login\""
    request.HTTPMethod = "POST"

    request.HTTPBody = payload1.dataUsingEncoding(NSUTF8StringEncoding);


    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue())
        {
            (response, data, error) in

            if let httpResponse = response as? NSHTTPURLResponse {
                let responseCode = httpResponse.statusCode
                print("Request Status \(responseCode)")
            }
            do
            {
                let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments)

                print("Json received \(json)")

                if let currItem = json["myKey"] as? String
                {
                    print(currItem)
                }
            }
            catch
            {
                print("error: \(error)")
            }
    }
}

当我用这个 php 脚本返回一个响应时,我得到了成功的响应:

<?php
$arr = array("myKey" => "myValue");
echo json_encode($arr);
?>

当我尝试这样的事情时:

<?php
$postVar = $_POST['r'];

if (!empty($postVar)) 
{
     $arr = array("status" => "it's ok");
     echo json_encode($arr);
}
else
{
     $arr = array("status" => "something wrong");
     echo json_encode($arr);
}
?>

我收到此错误:

Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}

【问题讨论】:

    标签: php swift http request


    【解决方案1】:

    马可,

    不要使用 NSMutableURLRequests,使用会话...前者已被 Apple 弃用。

    这是一个例子..

    func getMetaData(lePath:String, completion: (string: String?, error: ErrorType?) -> Void) {
    // **** get_metadata ****
        let request = NSMutableURLRequest(URL: NSURL(string: "https://api.dropboxapi.com/2/files/get_metadata")!)
        let session = NSURLSession.sharedSession()
        request.HTTPMethod = "POST"
    
        request.addValue("Bearer ab-blah", forHTTPHeaderField: "Authorization")
        request.addValue("application/json",forHTTPHeaderField: "Content-Type")
        request.addValue("path", forHTTPHeaderField: lePath)
        let cursor:NSDictionary? = ["path":lePath]
        do {
            let jsonData = try NSJSONSerialization.dataWithJSONObject(cursor!, options: [])
            request.HTTPBody = jsonData
            print("json ",jsonData)
        } catch {
            print("snafoo alert")
        }
    
        let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
            if let error = error {
                completion(string: nil, error: error)
                return
            }
            let strData = NSString(data: data!, encoding: NSUTF8StringEncoding)
            print("Body: \(strData)\n\n")
            do {
                let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers);
                self.jsonParser(jsonResult,field2file: "ignore")
                for (key, value) in self.parsedJson {
                    print("key2 \(key) value2 \(value)")
                }
    
                completion(string: "", error: nil)
            } catch {
                completion(string: nil, error: error)
            }
        })
        task.resume()
    
    }
    

    【讨论】:

    • 我只是用这个方法替换了那个方法,但问题仍然存在
    • lePath 是这个调用的一个参数,你可以忽略它。也发布修改后的代码?
    【解决方案2】:

    马可,

    我建议使用alamofire

    看看这个例子

    Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
             .responseJSON { response in
                 print(response.request)  // original URL request
                 print(response.response) // URL response
                 print(response.data)     // server data
                 print(response.result)   // result of response serialization
    
                 if let JSON = response.result.value {
                     print("JSON: \(JSON)")
                 }
             }
    

    非常简单,序列化工作完美

    你可以在一行中使用 pod 安装它。

    【讨论】:

      猜你喜欢
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 2014-12-24
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多