[英]How to send POST request to PHP file from Swift JSONEncoder
[英]Trying to send a post request with PHP from swift
我正在尝试将用户输入(通过UISearchBar完成)发送到我的PHP文件,以通过商店名称数据库进行搜索。 但是,似乎我的$ _POST变量$ searchWord为空。
我的快速代码:
func searchBarSearchButtonClicked(_ searchBar: UISearchBar)
{
if(searchBar.text!.isEmpty)
{
return
}
searchBar.resignFirstResponder()
doSearch(searchWord: searchBar.text!, searchbar: searchBar )
}
func doSearch(searchWord: String, searchbar: UISearchBar){
mysearchBar = searchbar
mysearchBar.resignFirstResponder()
let myURL = NSURL(string: "http://localhost:8080/searchStore.php")
var request = URLRequest(url:myURL! as URL)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
print("name=\(searchWord)")
let postString = "name=\(searchWord)"
request.httpBody = postString.data(using: String.Encoding.utf8)
request.addValue("application/json", forHTTPHeaderField: "Accept")
let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in
DispatchQueue.main.async() {
if error != nil{
self.displayAlertMessage(userMessage: (error?.localizedDescription)!)
return
}
do{
var _: Error?
//STOPPED HERE AS OF NOW
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
self.results.removeAll(keepingCapacity: false)
self.tableView.reloadData()
if let parseJSON = json{
print("json")
if let stores = parseJSON["stores"] as? [AnyObject]{
print("stores")
for storeOjb in stores{
let name = (storeOjb["name"] as! String)
self.results.append(name)
}
self.tableView.reloadData()
}else if(parseJSON["message"] != nil){
print("message")
let errorMessage = parseJSON["message"] as? String
if(errorMessage != nil){
self.displayAlertMessage(userMessage: errorMessage!)
}
}
}
} catch {
print(error)
}
}
}
task.resume()
}
func displayAlertMessage(userMessage: String)
{
let myAlert = UIAlertController(title: "Alert", message: userMessage, preferredStyle: UIAlertControllerStyle.alert);
let okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil)
myAlert.addAction(okAction);
self.present(myAlert, animated: true, completion: nil)
}
我的PHP文件
<?php
require("Conn.php");
require("MySQLDao.php");
$returnValue = array();
if(empty($_POST["name"])){
$returnValue["message"]= "Missing required field";
echo json_encode($returnValue);
return;
}
$searchWord =htmlentities($_POST["name"]);
$dao = new MySQLDao(Conn::$dbhost, Conn::$dbuser, Conn::$dbpass,
Conn::$dbname);
$dao->openConnection();
$storeNames = $dao->searchStore($name);
$dao->closeConnection();
$returnValue["stores"]=$storeNames;
echo json_encode($returnValue);
?>
类MySQLDao {
var $dbhost = null;
var $dbuser = null;
var $dbpass = null;
var $conn = null;
var $dbname = null;
var $result = null;
function __construct($dbhost, $dbuser, $dbpassword, $dbname) {
$this->dbhost = $dbhost;
$this->dbuser = $dbuser;
$this->dbpass = $dbpassword;
$this->dbname = $dbname;
}
public function openConnection() {
$this->conn = new mysqli($this->dbhost, $this->dbuser, $this->dbpass,
$this->dbname);
if (mysqli_connect_errno())
throw new Exception("Could not establish connection with database");
$this->conn->set_charset("utf8");
}
public function closeConnection() {
if ($this->conn != null)
$this->conn->close();
}
public function searchStore($name){
$returnValue = array();
$sql = "SELECT * FROM stores s WHERE s.name LIKE ? ";
$statement = $this->conn->prepare($sql);
if(!$statement)
throw new Exception($statement->error);
$name = '%' .$name. "%";
$result->bind_param("s", $name);
$result->execute();
$result = $statement->get_result();
while($myrow = $result->fetch_object())
{
$returnValue[] = $myrow;
}
return $returnValue;
}
}
?>
Conn.php包含MySQL连接详细信息。
快速代码中的PostString可以正确显示用户输入的内容(我可以使用断点弄清楚它)。 但是,无论何时搜索任何内容,我都会收到一条警告消息,提示“缺少必填字段”,表明我的$ _POST变量$ searchWord为空。 有谁知道如何解决这个问题?
仅当请求内容类型为x-www-form-urlencoded
时,才会填充PHP $_POST
数组。
如果您正在从Swift应用application/json
,那么您将需要从php输入流中解析请求主体: php://input
,也可以使用STDIN
常量。
但是,在我看来,您实际上打算发送x-www-form-urlencoded
数据,因此请适当地更改内容类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.