我一直在尝试通过 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()
最佳答案
一些观察:
您共享了使用
<$_POST
的 PHP。这意味着它正在等待x-www-form-urlencoded
请求。因此,在 Swift 中,您应该将请求的Content-Type
设置为application/x-www-form-urlencoded
因为这就是您要发送的内容。同样,在 Swift 中,请求的Accept
应该是application/json
因为您的代码将“接受”(或期望)JSON 响应。您提供的
values
字符串中包含空格。您在x-www-form-urlencoded
请求中发送的键值对中不能有空格。 (请注意,如果您的值
key 对中有任何非字母数字字符,则应对它们进行百分比编码。)在 Swift 错误处理程序中,除了打印
错误
之外,您可能还想尝试将data
转换为String
>,并查看其内容,例如if let string = String(data: data!, encoding: .utf8) { print(string) }
您可能还想查看
响应
并查看它报告的statusCode
内容。完成此操作后,您随后告诉我们它报告的statusCode
为 500。状态代码 500 表示 Web 服务中存在一些内部错误。 (如果成功,代码为 200。)这通常是由于未正确处理请求而出现某些错误的结果。例如,如果请求忽略了正确格式化请求,并且 Web 服务未预见/捕获该请求,或者 Web 服务器上存在其他内部错误,则您可能会收到 500 错误代码。有关状态代码列表,请参阅http://w3.org/Protocols/rfc2616/rfc2616-sec10.html .
如果您的网络服务响应正文中的文本不具有说明性,您可能需要打开错误报告(请参阅 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 ?>
关于ios - Swift 3 无法读取 HTTP Post 请求数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44209093/