サーバーの開発中、投稿されるデータをテストするために cURL を使用していました。現在、クライアント側で開発を行っていますが、サーバーから返されるデータの形式が正しくないようです。
最初に、cURL で送信していたものを示します。
curl -X PUT --data "requests[0][data_dictionary][primary_email_address]=myemail@domain.com&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] => myemail@domain.com
[first_name] => First
[surname] => Last
[password] => mypassword
)
)
)
これは私が期待するものです。クライアント側:
クラスに組み込まれる前の辞書はNSData
次のとおりです。NSJSONSerialization
["requests": (
{
"data_dictionary" = {
"first_name" = First;
password = mypassword;
"primary_email_address" = "myemail@domain.com";
surname = Last;
};
}
)]
そして、サーバーの応答は次のとおりです。
Request dictionaries: Array
(
[{
__"requests"_:_] => Array
(
[
{
"data_dictionary" : {
"first_name" : "First",
"primary_email_address" : "myemail@domain.com",
"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()
}
また、現在のコード (ここでは省略しました) に注目する価値があり、サーバーの証明書による認証を正常にスキップしています。