如何从Swift JSONECODER向PHP文件发送POST请求

如何从Swift JSONECODER向PHP文件发送POST请求,php,swift,forms,post,Php,Swift,Forms,Post,我有点问题。我有一个从文本输入获取值的结构设置: struct CheckoutData: Codable { var firstName: String var lastName: String var email: String var streetAddress: String var streetAddress2: String var city: String var state: String var zipCode:

我有点问题。我有一个从文本输入获取值的结构设置:

struct CheckoutData: Codable {
    var firstName: String
    var lastName: String
    var email: String
    var streetAddress: String
    var streetAddress2: String
    var city: String
    var state: String
    var zipCode: String
    var total: Double
}
然后我初始化它并对其进行编码:

let checkoutData = CheckoutData(
    firstName: firstName.trimmingCharacters(in: .whitespacesAndNewlines),
    lastName: lastName.trimmingCharacters(in: .whitespacesAndNewlines),
    email: email.trimmingCharacters(in: .whitespacesAndNewlines),
    streetAddress: streetAddress.trimmingCharacters(in: .whitespacesAndNewlines),
    streetAddress2: streetAddress2.trimmingCharacters(in: .whitespacesAndNewlines),
    city: city.trimmingCharacters(in: .whitespacesAndNewlines),
    state: state.trimmingCharacters(in: .whitespacesAndNewlines),
    zipCode: zipCode.trimmingCharacters(in: .whitespacesAndNewlines),
    total: total
)

let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted

let encoded = try! encoder.encode(checkoutData)

var request = URLRequest(url: URL(string: "https://www.MyApp.com/file.php")!)
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
request.httpBody = encoded
URLSession.shared.dataTask(with: request) { data, response, error in }.resume()
下面是处理发送电子邮件的PHP流程:

$emailto = "myemail@gmail.com";
$subject = "Mobile Order";

$firstName = $_POST["firstName"];
$lastName = $_POST["lastName"];
$email = $_POST["email"];
$streetAddress = $_POST["streetAddress"];
$streetAddress2 = $_POST["streetAddress2"];
$city = $_POST["city"];
$state = $_POST["state"];
$zipCode = $_POST["zipCode"];
$total = $_POST["total"];

$entire = "
    Full name: {$firstName} {$lastName}\n
    Email: {$email}\n
    Street address: {$streetAddress}\n
    Apt #, floor, etc: {$streetAddress2}\n
    City, state, zip code: {$city}, {$state} {$zipCode}\n\n

    Total: ${$total}
";

mail($emailto, $subject, $entire);

然而,当我收到电子邮件时,所有变量都是空的。我已经打印了编码版本,似乎编码正确,所以很可能是在PHP端。很抱歉,这有点像代码转储,但我无法解决这个问题。非常感谢

以下是通过远程服务器上的PHP文件发送电子邮件的示例

// View controller //
import UIKit

class HomeViewController: UIViewController {
    @IBAction func sendTapped(_ sender: UIButton) {
        DispatchQueue.global().async() {
            var request = URLRequest(url: URL(string: "https://www.MyApp.com/file.php")!)
            request.httpMethod = "POST"
            let to = "tom123@apple.com"
            let sub = "Just testing..."
            let msg = "How are you doing?"
            let from = "George H. Aniston <ghaniston@gmail.com>"
            let postString = "a=\(to)&b=\(sub)&c=\(msg)&d=\(from)"
            request.httpBody = postString.data(using: .utf8)
            let task = URLSession.shared.dataTask(with: request) { data, response, error in
                guard let data = data, error == nil else {
                    print("error=\(String(describing: error))")
                    return
                }
                
                if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
                    print("statusCode should be 200, but is \(httpStatus.statusCode)")
                    print("response = \(String(describing: response))")
                }
                
                let responseString = String(data: data, encoding: .utf8)
                print("responseString = \(String(describing: responseString))")
            }
            task.resume()
        }
    }
}

// file.php //
<?php

$to = $_POST['a'];
$sub = $_POST['b'];
$msg = $_POST['c'];
$from = $_POST['d'];

// use wordwrap() if lines are longer than 70 characters
$msg = wordwrap($msg,70);

$headers = 'From: '.$from."\r\n".
'Reply-To: '.$from."\r\n" .
'X-Mailer: PHP/' . phpversion();

// send email
mail($to, $sub, $msg, $headers);
?>
//视图控制器//
导入UIKit
类HomeViewController:UIViewController{
@iAction func sendTapped(\uSender:ui按钮){
DispatchQueue.global().async(){
var request=URLRequest(url:url(字符串):https://www.MyApp.com/file.php")!)
request.httpMethod=“POST”
让我们来看一看tom123@apple.com"
让sub=“只是测试…”
让msg=“你好吗?”
let from=“乔治·H·安妮斯顿”
让postString=“a=\(to)&b=\(sub)&c=\(msg)&d=\(from)”
request.httpBody=postString.data(使用:.utf8)
让task=URLSession.shared.dataTask(with:request){data,response,中的错误
保护let数据=数据,错误==nil else{
打印(“错误=\(字符串(描述:错误)))
返回
}
如果让httpStatus=响应为?HTTPURLResponse,则httpStatus.statusCode!=200{
打印(“状态代码应为200,但为\(httpStatus.statusCode)”)
打印(“响应=\(字符串(描述:响应)))
}
let responseString=String(数据:数据,编码:.utf8)
打印(“responseString=\(字符串(描述:responseString)))
}
task.resume()
}
}
}
//file.php//

var\u dump($\u POST)你得到了什么?在尝试使用之前,请始终确保post变量存在,然后执行类似于
$firstName=isset($\u post[“firstName”])的操作$_帖子[“名字]:”
通过这种方式预处理未定义的错误为什么需要发送JSON对象?
encoder.outputFormatting=.Prettypted
:无需放置漂亮的格式化程序,应该可以。@KyleHorkley抱歉,我不理解您响应的第一部分。只需执行
var\u转储($\u POST);退出()在脚本的开头。这样,您就可以确保您的脚本接收到了所有的变量sok,那么问题就出在Swift中了。我从来没有用过,所以我帮不了你,所以你是说作者应该使用编码的url参数(
application/x-www-form-urlencoded
in header?)JSON有什么错?是不是PHPPAR不期望JSON?@拉米,我也不知道,但是使用这些参数在最终的结果上似乎没有什么区别,这工作得很好,而不是使用CODLE并使之成为JSON对象。