7
7

More than 5 years have passed since last update.

Alamofire のリクエストをコマンドライン(curl)で再現する

Posted at

Alamofire のリクエストを調べていて発見したのでメモ。

Alamofre の Request インスタンスを生成する部分で break させて、 この時に lldb の po コマンドで評価してみると、

スクリーンショット 2015-10-13 8.35.08.png

下記のように Alamofire で送信するリクエスト相当の curl コマンドが吐き出されます。

スクリーンショット 2015-10-13 8.50.51.png

(※これって内部的には iOS アプリの通信は curl が使われているってことなんでしょうか)

たまたま気づいただけなのですがこれでサーバーとうまく通信できない時の問題の切り分けに使えますね。

おまけ

試したコードは下記です。

import Alamofire

enum Router: URLRequestConvertible {
    static let baseUrl = "https://example.com/1.1/"

    case ReadSelf([String: AnyObject])

    var method: Alamofire.Method {
        switch self {
        case .ReadSelf:
            return .GET
        }
    }

    var path: String {
        switch self {
        case .ReadSelf(_):
            return "users/show.json"
        }
    }

    var URLRequest: NSMutableURLRequest {
        get {
            let URL = NSURL(string: TwitterRouter.baseUrl)!.URLByAppendingPathComponent(path)

            var mutableURLRequest = NSMutableURLRequest(URL: URL)
            mutableURLRequest.HTTPMethod = method.rawValue

            switch self {
            case .ReadSelf(let parameters):
                mutableURLRequest = ParameterEncoding.URL.encode(mutableURLRequest, parameters: parameters).0
            }

            return mutableURLRequest
        }
    }
}

class Client: NSObject {

    class func getuserInfo(userid: String, screenName: String, success: SucessHandler, failure: FailureHandler) {
        let req = request(Router.ReadSelf(["user_id" : userid, "screen_name" : screenName]))
        self.sendRequest(req, success: success, failure: failure, block: nil) // <- ここで break
    }

    class func sendRequest(request: Request, success: SucessHandler, failure: FailureHandler, block: ((AnyObject?) -> Void)?) {
        request.responseJSON(options: NSJSONReadingOptions.AllowFragments) { (request, response, json) -> Void in
            switch json{
            case .Success(let data):
                block?(data)
                success(data)
            case .Failure(let data, let _):
                Logger.log("failed. status code = \(response?.statusCode), \(request?.URL?.absoluteString)")
                let err = NSError(domain: "howdy", code: 1, userInfo:nil)
                failure(response, data, err)
            }
        }
    }
}

Swift2 用 Alamofire になってエラーハンドリングのやり方がうまくできず悩み中。。

7
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7