Целью этого кода является отправка данных в базу данных SQL с использованием сценария PHP.
Но когда я пытаюсь запустить его, я получаю следующую ошибку:
Ошибка Domain = NSCocoaErrorDomain Code = 3840 «Текст JSON не начинался с массива или объекта и опции, позволяющей не устанавливать фрагменты.» UserInfo = {NSDebugDescription = Текст JSON не начинался с массива или объекта, и параметр, позволяющий не устанавливать фрагменты.}
Это мой код:
// Send userdata to server side
let myURL = NSURL(string: "http://localhost/userRegister.php");
let request = NSMutableURLRequest(URL:myURL!);
request.HTTPMethod = "POST";
let postString = "email=\(userEmail)&password=\(userPassword)";
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding);
// Create the task and execute it
let task = NSURLSession.sharedSession().dataTaskWithRequest(request){
data,response, error in
if error != nil{
print("error=\(error)")
return
}
var err: NSError?
do
{
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary
if let parseJSON = json {
var resultValue = parseJSON["status"] as? String
print("result: \(resultValue)")
var isUserRegisterd:Bool = false;
if(resultValue=="Success")
{
isUserRegisterd = true
}
var messageToDisplay: String = (parseJSON["message"] as? String)!
if(!isUserRegisterd)
{
messageToDisplay = (parseJSON["message"] as? String)!
}
dispatch_async(dispatch_get_main_queue(), {
var myAlert = UIAlertController(title: "Alert", message: messageToDisplay, preferredStyle: UIAlertControllerStyle.Alert);
let okAction = UIAlertAction(title: "Oké", style: UIAlertActionStyle.Default){
action in
self.dismissViewControllerAnimated(true, completion: nil);
}
myAlert.addAction(okAction);
self.presentViewController(myAlert, animated: true, completion: nil);
});
}
}
catch
{
print(error)
}
}
task.resume()
В чем здесь проблема?
Эта ошибка обычно означает, что NSData
не содержит действительный JSON.
Вы должны посмотреть на response
и строковое представление data
потому что если сервер столкнулся с проблемой, он, скорее всего, вернул бы statusCode
в NSHTTPURLResponse
(где 200
означает, что все было в порядке, RFC 2616 описывает, что означают другие коды ошибок) и NSData
скорее всего содержит HTML или текст, описывающий природу проблемы:
do {
// your code where you `try` parsing the JSON response goes here
} catch {
print(error)
if data != nil {
let string = String(data: data!, encoding: NSUTF8StringEncoding)
print(string)
}
print(response)
}
Когда вы смотрите на NSURLResponse
а также NSData
объекты, вы будете гораздо чаще диагностировать проблему.
—
Кстати, я мог бы посоветовать указать Content-Type
запроса. Кроме того, я бы предложил процентное экранирование адреса электронной почты и пароля. Последнее важно, потому что, если значения содержат специальные символы (например, +
а также &
проблемы), данные не будут корректно обработаны сервером.
let url = NSURL(string: "http://localhost/userRegister.php")
let request = NSMutableURLRequest(URL: url!)
request.HTTPMethod = "POST"request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
let encodedEmail = userEmail.stringByAddingPercentEncodingForFormUrlencoded()
let encodedPassword = userPassword.stringByAddingPercentEncodingForFormUrlencoded()
let postString = "email=\(encodedEmail)&password=\(encodedPassword)"request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
куда
extension String {
/// Percent escape value to be added to a HTTP request
///
/// This percent-escapes all characters besize the alphanumeric character set and "-", ".", "_", and "*".
/// This will also replace spaces with the "+" character as outlined in the application/x-www-form-urlencoded spec:
///
/// http://www.w3.org/TR/html5/forms.html#application/x-www-form-urlencoded-encoding-algorithm
///
/// - returns: Return percent escaped string.
func stringByAddingPercentEncodingForFormUrlencoded() -> String? {
let allowedCharacters = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._* ")
return stringByAddingPercentEncodingWithAllowedCharacters(allowedCharacters)?.stringByReplacingOccurrencesOfString(" ", withString: "+")
}
}
Кроме того, вы можете создать набор символов из допустимых символов, начиная с URLQueryAllowedCharacterSet
, но вам все равно придется удалить несколько символов, так как в противном случае некоторые символы пропускаются без экранирования (например, +
). Увидеть https://stackoverflow.com/a/35912606/1271826.
Или вы можете использовать такие рамки, как Alamofire который заботится об этих деталях для вас.
В моем случае даже следующий код вызывал эту ошибку, добавляя дополнительные // косые черты в начале вывода.
$arr = array("status" => 1, "msg" => "Your message goes here!");
echo json_encode($arr);
Причина была в том, что эти дополнительные символы печатались в другом файле, который я включил в этот файл.