从 iOS 9 / Swift 2.0 发送 HTTP POST 请求时,PHP 服务器没有收到正确的数据

Posted

技术标签:

【中文标题】从 iOS 9 / Swift 2.0 发送 HTTP POST 请求时,PHP 服务器没有收到正确的数据【英文标题】:Not receiving correct data at PHP server when sending an HTTP POST Request from iOS 9 / Swift 2.0 【发布时间】:2015-11-03 10:07:07 【问题描述】:

当我使用 Swift 从 ios 发布 "username=abc&password=xyz" 到 index.php 时,我必须在我的服务器上接收

$_POST["username"] //“abc”

$_POST["password"] //“xyz”

但我收到了

$_POST["username"] //可选(“abc”)

$_POST["password"] //可选(“xyz”)

在找出错误时发现问题。请提出合适的解决方案。

注意:I am using Xcode 7.0.1, Swift 2.0, Simulator: iPhone 5, Deployment Target: iOS 9.0, Server = "Apache/2.4.12 (Win32) OpenSSL/1.0.1m PHP/5.6.11";

这是我的快速代码

let request = NSMutableURLRequest(URL:NSURL(string:"http://192.168.1.7/testSwiftPOST/index.php")!)
request.HTTPMethod = "POST"
let postString = "username=abc&password=xyz"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
request.setValue("application/x-www-form-urlencoded; charset=utf-8", forHTTPHeaderField: "Content-Type")

let task = NSURLSession.sharedSession().dataTaskWithRequest(request) (data, response, error) -> Void in
        if let Data = data 
            print(NSString(data: Data, encoding: NSUTF8StringEncoding)!) // this prints the data of the $_POST variable in the debug area
        

task.resume()

这是我的 php 代码

<?php
    print_r($_POST);

这是我在 Xcode 调试区域的输出:

Array
(
    [username] => Optional("abc")
    [password] => Optional("xyz")
)

仅供参考(仅供参考),我还在 info.plist 文件中添加了以下设置:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>192.168.1.7/</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

上面的代码在带有 iOS 8.4 的 Xcode 6 中完美运行,但是在升级到带有 iOS 9.0 的 Xcode 7 后问题就开始了

【问题讨论】:

【参考方案1】:

dataUsingEncoding 返回一个可选值。您必须在将其发送到请求中之前将其打开

request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)!

【讨论】:

谢谢本杰明,您的解决方案对我有用。但是我发现了一件奇怪的事情,现在我上面发布的问题代码也可以正常工作,无需任何更改。只是想知道 iOS 开发有时会变得疯狂!!!

以上是关于从 iOS 9 / Swift 2.0 发送 HTTP POST 请求时,PHP 服务器没有收到正确的数据的主要内容,如果未能解决你的问题,请参考以下文章

无效的 Swift 支持 - 适用于 iOS 9 的 Swift 2.0 项目,(Xcode build 7A220)

MKAnnotations 未显示在地图上 iOS 9 / Swift 2.0

iOS 9(Swift 2.0):无法使用类型为“(NSURL,(_,_,_)throws-> Void)”的参数列表调用“dataTaskwithURL”

从Swift 2.0 Contact Framework iOS中的CNContactPicker获取电子邮件地址

接收自定义通知 iOS swift 2.0

直接从设备向设备发送推送通知 swift 3