无法读取HTTP Post Request数据Swift 3

时间:2017-05-26 19:44:09

标签: ios swift http post

我一直在尝试通过Http“POST”方法获取数据。在我的php脚本中,我有一个关键的调用“categoryWise”,它有一个名为“flower”的值。我把所有必要的代码但它没有工作并说无法读取数据,因为它的格式不正确。请帮忙。

    let values = "categoryWise= nature"

    let parameter = values.data(using: .utf8)


    let url = "https://mahadehasancom.000webhostapp.com/WallpaperApp/php_scripts/getImageByCategory.php"

    var request = URLRequest(url: URL(string: url)!)
    request.httpMethod = "POST"
    request.httpBody = parameter

    request.setValue("application/x-content-type-options", forHTTPHeaderField: "Content-Type")
    request.setValue("application/x-content-type-options", forHTTPHeaderField: "Accept")


    let task = URLSession.shared.dataTask(with: request) { (data, response, error) in

        if (error != nil)
        {
            print(error!)
        }
        else
        {
            do
            {
                let fetchData = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
                //print(fetchData)
                let actorArray = fetchData?["result"] as? NSArray
                for actor in actorArray!
                {
                    let nameDict = actor as? NSDictionary

                    let name = nameDict?["date"] as! String
                    let countryname = nameDict?["category"] as! String
                    let imageUrl = nameDict?["url"] as! String
                    //let pageUrl = nameDict?["url"] as! String

                    authorArray.append(name)
                    titleArray.append(countryname)
                    imageURL.append(imageUrl)
                    //urlArray.append(pageUrl)

                }

                DispatchQueue.main.async {
                    self.CountryNameTable.reloadData()
                }

                print(authorArray)
                print(titleArray)
                print(imageURL)
                print(urlArray)
            }

            catch let Error2
            {
                print(Error2.localizedDescription)

                if let string = String(data: data!, encoding: .utf8)
                {
                    print(string)
                    print(response!)
                }
            }

        }
    }

    task.resume()

1 个答案:

答案 0 :(得分:0)

一些观察结果:

  1. 您共享使用$_POST的PHP。这意味着它期待x-www-form-urlencoded请求。因此,在Swift中,您应该将请求的Content-Type设置为application/x-www-form-urlencoded,因为这就是您要发送的内容。同样,在Swift中,请求的Accept应为application/json,因为您的代码将“接受”(或期望)JSON响应。

  2. 您提供的values字符串中有一个空格。您在x-www-form-urlencoded请求中发送的键值对中不能有空格。 (注意,如果您的values密钥对中有任何非字母数字字符,则应对其进行百分比编码。)

  3. 在您的Swift错误处理程序中,除了打印error之外,您可能还想尝试将data转换为String,并查看它的内容,例如

    if let string = String(data: data!, encoding: .utf8) {
        print(string)
    }
    
  4. 您可能还想查看response并查看其报告的statusCode。完成后,您随后告诉我们它报告了statusCode 500。

    状态代码500表示Web服务中存在一些内部错误。 (如果成功,则代码为200.)这通常是由于请求未正确处理而出现一些错误的结果。例如,如果请求忽略了正确格式化请求并且Web服务没有预期/捕获它,或者Web服务器上存在其他内部错误,则可能会获得500错误代码。有关状态代码列表,请参阅http://w3.org/Protocols/rfc2616/rfc2616-sec10.html

  5. 如果您的网络服务的回复正文中的文字没有启发,您可能需要启用错误报告(请参阅How to get useful error messages in PHP?How do I catch a PHP Fatal Error),然后查看身体的反应再次。例如,您可以在PHP中包含以下内容:

    <?php
    
    function __fatalHandler() {
        $error = error_get_last();
        //check if it's a core/fatal error, otherwise it's a normal shutdown
        if ($error !== NULL && in_array($error['type'], array(E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING))) {
            header("Content-Type: application/json");
            $result = Array("success" => false, "error" => $error);
            echo json_encode($result);
            die;
        }
    }
    register_shutdown_function('__fatalHandler');
    // the rest of your PHP here
    ?>