クラス
import Foundation
class RequestManager:NSObject,NSURLConnectionDelegate,NSURLConnectionDataDelegate{
var storedData:NSMutableData?
//------------------ init --------------------
override init(){
}
//------------------ common --------------------
private func getQueryStringByDic(dic:Dictionary<String,String>) -> String{
var tmp:[String] = []
for key:String in dic.keys {
tmp.append("\(key)=\(dic[key])")
}
return join("&",tmp)
}
private func getUrlEncodedQueryStringByDic(dic:Dictionary<String,String>) -> String{
var tmp:[String] = []
for key:String in dic.keys {
let value:String = dic[key]!
tmp.append("\(key)=\(value.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.alphanumericCharacterSet())!)")
}
return join("&",tmp)
}
private func getDeviceDatetimeString() -> String{
let date:NSDate = NSDate(timeIntervalSinceNow:NSTimeInterval(NSTimeZone.systemTimeZone().secondsFromGMT))
var form:NSDateFormatter = NSDateFormatter()
form.calendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)
form.dateFormat = "yyyy-MM-dd HH:mm:ss"
form.timeZone = NSTimeZone(forSecondsFromGMT: 0)
form.locale = NSLocale(localeIdentifier: "en_US_POSIX")
return form.stringFromDate(date)
}
/**
返り値は[AnyObject]またはDictionary
**/
private func getDataByJsonString(json:String) -> AnyObject?{
let jsonData:NSData? = json.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
if jsonData == nil {
return nil
}
var error: NSError? = nil
let data:AnyObject? = NSJSONSerialization.JSONObjectWithData(jsonData!, options: NSJSONReadingOptions.AllowFragments, error: &error)
if error != nil {
return nil
}
return data
}
//------------------ send --------------------
func sendHttpGetRequestWithURL(url:String,queryDic:Dictionary<String,String>?) -> NSURLConnection?{
self.storedData = NSMutableData()
var queryString:String = ""
if queryDic != nil {
queryString = "?" + self.getUrlEncodedQueryStringByDic(queryDic!)
}
let request:NSURLRequest = NSURLRequest(URL: NSURL(string: url + queryString)!)
return NSURLConnection(request: request, delegate: self)
}
func sendHttpPostRequestWithURL(url:String,queryDic:Dictionary<String,String>?) -> NSURLConnection?{
self.storedData = NSMutableData()
let request:NSMutableURLRequest = NSMutableURLRequest(URL: NSURL(string:url)!)
request.HTTPMethod = "POST"
request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData
request.timeoutInterval = 20
request.HTTPShouldHandleCookies = false
request.HTTPBody = self.getQueryStringByDic(queryDic!).dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
return NSURLConnection(request: request, delegate: self)
}
func connection(connection: NSURLConnection, didReceiveResponse response: NSURLResponse) {
println(response)
}
func connection(connection: NSURLConnection, didReceiveData data: NSData) {
self.storedData?.appendData(data)
}
func connection(connection: NSURLConnection, didReceiveAuthenticationChallenge challenge: NSURLAuthenticationChallenge) {
//basic認証のid,passを求められたら
if challenge.previousFailureCount == 0 {
let newCredential:NSURLCredential = NSURLCredential(user: "userID", password: "password", persistence: NSURLCredentialPersistence.ForSession)
challenge.sender.useCredential(newCredential, forAuthenticationChallenge: challenge)
}else{
//認証失敗
println("authentication failed")
}
}
func connectionDidFinishLoading(connection: NSURLConnection) {
let jsonString:String? = NSString(data: self.storedData!, encoding: NSUTF8StringEncoding)
if jsonString == nil {
println("connectionDidFinishLoading Failed 1")
return
}
let json:AnyObject? = self.getDataByJsonString(jsonString!)
if json == nil {
println("connectionDidFinishLoading Failed 2")
return
}
if json is Dictionary<String,AnyObject> {
println("json is Dictionary")
self.logDic(json as Dictionary<String,AnyObject>)
}else if json is [AnyObject] {
println("json is Array")
self.logArray(json as [AnyObject])
}
}
private func logDic(dic:Dictionary<String,AnyObject>){
for key:String in dic.keys {
println("\(key) : \(dic[key])")
}
}
private func logArray(list:[AnyObject]){
for (i:Int,obj:AnyObject) in enumerate(list) {
println("\(i) : \(obj)")
}
}
}
実行
var reqdic:Dictionary<String,String> = Dictionary()
reqdic["sendDatetime"] = self.getDeviceDatetimeString()
reqdic["message"] = "どうしてもつかまるです。むぎちゃ。"
let reqm:RequestManager = RequestManager()
//GET
reqm.sendHttpGetRequestWithURL("/php/50/index.php", queryDic: reqdic)
//POST
reqm.sendHttpPostRequestWithURL("/php/50/index.php", queryDic: reqdic)
PHP
$tmp=array("yourData" => "none" );
if(!empty($_GET)){
$tmp["yourData"]=$_GET;
$tmp["method"]="GET";
}else if(!empty($_POST)){
$tmp["yourData"]=$_POST;
$tmp["method"]="POST";
}
$tmp["datetime"]=date("Y-m-d H:i:s");
$tmp["randomStr"]=getRandomStr(48);
$tmp["name"]="john";
$tmp["place"]="newyork";
$tmp["device"]="iPhone5s";
header("Content-Type: application/json; charset=utf-8");
echo json_encode($tmp);
exit;
function getRandomStr($length=8){
$str='';
for ($i = 0, $str = null; $i < $length; ) {
$num = mt_rand(0x30, 0x7A);
if ((0x30 <= $num && $num <= 0x39) || (0x41 <= $num && $num <= 0x5A) || (0x61 <= $num && $num <= 0x7A)) {
$str .= chr($num);
$i++;
}
}
return $str;
}
出力結果
<NSHTTPURLResponse: 0x7fcd5ad0ec20> { URL: /php/50/index.php } { status code: 200, headers {
Connection = "Keep-Alive";
"Content-Type" = "application/json; charset=utf-8";
Date = "Tue, 09 Jun 2015 10:24:37 GMT";
"Keep-Alive" = "timeout=5, max=100";
Server = Apache;
"Transfer-Encoding" = Identity;
"X-Powered-By" = "PHP/5.4.32";
} }
json is Dictionary
yourData : Optional({
message = "Optional(\"\U3069\U3046\U3057\U3066\U3082\U3064\U304b\U307e\U308b\U3067\U3059\U3002\U3080\U304e\U3061\U3083\U3002\")";
sendDatetime = "Optional(\"2015-06-09 19:24:38\")";
})
device : Optional(iPhone5s)
place : Optional(newyork)
method : Optional(POST)
datetime : Optional(2015-06-09 19:24:37)
randomStr : Optional(LM3HqZ3X2GG6nQ9APqZ67gSud3mbLjHMzjTommuH0gwaxsMN)
name : Optional(john)