 
 extension URLRequest {
     public enum HTTPMethod: Int {
-        case options = 0, get, head, post, put, patch, delete, trace, connect
+        case get = 0, head, delete, post
+    }
+    public enum ContentType: Int {
+        case www_form_urlencoded = 0, json
     }
 }
 
 extension URLRequest.HTTPMethod {
     init?(rawString: String) {
         switch rawString {
-        case "OPTIONS": self = .options
         case "GET": self = .get
         case "HEAD": self = .head
+        case "DELETE": self = .delete
         case "POST": self = .post
-        case "PUT": self = .put
-        case "PATCH": self = .patch
-        case "DELETE": self = .delete
-        case "TRACE": self = .trace
-        case "CONNECT": self = .connect
-        default: return nil
+        default:
+            // unsupport type: "OPTIONS" "PUT" "PATCH" "TRACE" "CONNECT"
+            return nil
         }
     }
-    fileprivate var rawString: String {
+    var rawString: String {
         switch self {
-        case .options: return "OPTIONS"
         case .get: return "GET"
         case .head: return "HEAD"
+        case .delete: return "DELETE"
         case .post: return "POST"
-        case .put: return "PUT"
-        case .patch: return "PATCH"
-        case .delete: return "DELETE"
-        case .trace: return "TRACE"
-        case .connect: return "CONNECT"
+        }
+    }
+}
+
+extension URLRequest.ContentType {
+    init?(rawString: String) {
+        switch rawString {
+        case "application/x-www-form-urlencoded": self = .www_form_urlencoded
+        case "application/json": self = .json
+        default:
+            // unsupport type "charset=utf-8", "multipart/form-data", "text/xml"
+            return nil
+        }
+    }
+    var rawString: String {
+        switch self {
+        case .www_form_urlencoded: return "application/x-www-form-urlencoded"
+        case .json: return "application/json"
         }
     }
 }
 
 extension URLRequest {
-    public init?(method: HTTPMethod, url: String, parameters: [String: Any]?) {
+    public init?(method: HTTPMethod, url: String, parameters: [String: Any]? = nil, contentType: ContentType? = nil) {
         guard let parameters = parameters else {
             self.init(method: method.rawString, url: url, body: nil)
             return

        }
        return components
    }
    private static func query(_ parameters: [String: Any]) -> String {
        var components: [(String, String)] = []
        for key in parameters.keys.sorted(by: <) {
            let value = parameters[key]!
            components += queryComponents(fromKey: key, value: value)
        }
        return components.map { "\($0)=\($1)" }.joined(separator: "&")
    }
}

        self.allowsCellularAccess = true
        self.httpMethod = method
        [
            // Content-Type will be set automatic by data type
            // example:
            // "*/*": "Accept"
            // "application/x-www-form-urlencoded": "Content-Type"
