Swift — искаженные данные при отправке словаря на сервер

Во время разработки сервера я использовал cURL для проверки публикуемых данных. Сейчас я занимаюсь разработкой на стороне клиента, и данные, возвращаемые с сервера, кажутся некорректными.

Во-первых, я покажу вам, что я отправлял с помощью cURL:

curl -X PUT --data "requests[0][data_dictionary][primary_email_address][email protected]&requests[0][data_dictionary][first_name]=First&requests[0][data_dictionary][surname]=Last&requests[0][data_dictionary][password]=mypassword" -k -L https://localhost/rest/v1/account/create

И когда я распечатываю полученные данные, я получаю следующее:

Request dictionaries: Array
(
[0] => Array
(
[data_dictionary] => Array
(
[primary_email_address] => [email protected]
[first_name] => First
[surname] => Last
[password] => mypassword
)

)

)

Это то, что я ожидаю. Теперь на стороне клиента:

Вот словарь до того, как NSData с NSJSONSerialization учебный класс:

["requests": (
{
"data_dictionary" =         {
"first_name" = First;
password = mypassword;
"primary_email_address" = "[email protected]";
surname = Last;
};
}
)]

А вот ответ сервера:

Request dictionaries: Array
(
[{
__"requests"_:_] => Array
(
[
{
"data_dictionary" : {
"first_name" : "First",
"primary_email_address" : "[email protected]",
"surname" : "Last",
"password" : "mypassword"}
}
] =>
)

)

Затем, когда я пытаюсь получить доступ к ключевым «запросам», сервер, естественно, ответил с неопределенной ошибкой смещения.

Вот функция, которая отправляет данные на сервер. Обратите внимание, я также проверил метод HTTP, и это «PUT», как и ожидалось:

public func fetchResponses(completionHandler: FetchResponsesCompletionHandler)
{
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),
delegate: self,
delegateQueue: nil)

let request = NSMutableURLRequest(URL: requestConfiguration.restURI)
request.HTTPMethod = requestConfiguration.httpMethod

if (requestConfiguration.postDictionary != nil)
{
print("Dictionary to be posted: \(requestConfiguration.postDictionary!)")


//  Turn the dictionary in to a JSON NSData object

let jsonData: NSData

do
{
jsonData = try NSJSONSerialization.dataWithJSONObject(requestConfiguration.postDictionary!, options: [.PrettyPrinted])
}
catch let jsonError as NSError
{
fatalError("JSON error when encoding request data: \(jsonError)")
}


//  Set HTTP Body with the post dictionary's data

request.HTTPBody = jsonData


//  Set HTTP headers

request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("application/json", forHTTPHeaderField: "Accept")

request.setValue("\(request.HTTPBody!.length)", forHTTPHeaderField: "Content-Length")
}


let task = session.dataTaskWithRequest(request) { (data, response, error) in

//  Check return values

if error != nil
{
fatalError("Request error: \(error)")
}



//  Get JSON data

let jsonDictionary: NSDictionary

do {
jsonDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as! NSDictionary
}
catch let jsonError as NSError
{
let responseAsString = NSString(data: data!, encoding: NSUTF8StringEncoding)!

print("Server return data as string: \(responseAsString)")

fatalError("JSON Error when decoding response data: \(jsonError)")
}


//  Do some stuff with the data


//      Complete with the client responses

completionHandler(error: nil, responses: clientResponses)
}

task.resume()
}

Также стоит отметить мой код в настоящее время (я оставил его здесь) и успешно пропускает аутентификацию с помощью сертификата сервера.

0

Решение

Итак, получается, что на самом деле я отправляю объект JSON, где мой сервер ожидает строку параметров. Это разные вещи. Чтобы исправить это, мне нужно было использовать json_decode( file_get_contents('php://input'), true) чтобы получить объект JSON в качестве ассоциативного массива.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]