Json 如何通过Swift发送POST请求?

Json 如何通过Swift发送POST请求?,json,swift,xcode,postman,Json,Swift,Xcode,Postman,我的控制器是这样的- def create if (@user = User.find_by_email(params[:email])) && @user.valid_password?(params[:password]) render json: @user.as_json(only: [:email,:authentication_token]),status: :created else render json:('Unauthor

我的控制器是这样的-

def create
   if (@user = User.find_by_email(params[:email])) && @user.valid_password?(params[:password])
      render json: @user.as_json(only: [:email,:authentication_token]),status: :created
   else 
      render json:('Unauthorized Access')
   end  
end 
当我使用邮递员发出此请求时,我会选择Body和form数据,并将其添加到电子邮件和密码中。这是有效的

如何使用swift进行同样的操作?这就是我尝试过的

let url = URL(string: "http://localhost:3000/api/v1/user_serialized/")

let config = URLSessionConfiguration.default

let request = NSMutableURLRequest(url: url!)

request.httpMethod = "POST"

let bodyData = "email=Test@test.com&password=Test1234"

request.httpBody = bodyData.data(using: String.Encoding.utf8);

let session = URLSession(configuration: config)

let task = session.dataTask(with: url! as URL, completionHandler: {(data, response, error) in
    let json = JSON(data:data!)

    debugPrint(json)
})

task.resume()

我认为您应该将请求而不是url传递到session.dataTask

下面是我的代码的样子:

private let url = URL(string: "http://example.com/")!

func httpPost(jsonData: Data) {
    if !jsonData.isEmpty {
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.httpBody = jsonData

        URLSession.shared.getAllTasks { (openTasks: [URLSessionTask]) in
            NSLog("open tasks: \(openTasks)")
        }

        let task = URLSession.shared.dataTask(with: request, completionHandler: { (responseData: Data?, response: URLResponse?, error: Error?) in
            NSLog("\(response)")
        })
        task.resume()
    }
}

我已经创建了一个自定义HTTP类,我们可以在其中发送url和参数,并从API获取数据。下面是课堂

import Foundation

//HTTP Methods
enum HttpMethod : String {
   case  GET
   case  POST
   case  DELETE
   case  PUT
}


class HttpClientApi: NSObject{

//TODO: remove app transport security arbitary constant from info.plist file once we get API's
 var request : URLRequest?
 var session : URLSession?

static func instance() ->  HttpClientApi{

    return HttpClientApi()
}



func makeAPICall(url: String,params: Dictionary<String, Any>?, method: HttpMethod, success:@escaping ( Data? ,HTTPURLResponse?  , NSError? ) -> Void, failure: @escaping ( Data? ,HTTPURLResponse?  , NSError? )-> Void) {

     request = URLRequest(url: URL(string: url)!)

    logging.print("URL = \(url)")

    if let params = params {


        let  jsonData = try? JSONSerialization.data(withJSONObject: params, options: .prettyPrinted)

        request?.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request?.httpBody = jsonData//?.base64EncodedData()


        //paramString.data(using: String.Encoding.utf8)
    }
    request?.httpMethod = method.rawValue


    let configuration = URLSessionConfiguration.default

    configuration.timeoutIntervalForRequest = 30
    configuration.timeoutIntervalForResource = 30

    session = URLSession(configuration: configuration)
    //session?.configuration.timeoutIntervalForResource = 5
    //session?.configuration.timeoutIntervalForRequest = 5

    session?.dataTask(with: request! as URLRequest) { (data, response, error) -> Void in

        if let data = data {

            if let response = response as? HTTPURLResponse, 200...299 ~= response.statusCode {
                success(data , response , error as? NSError)
            } else {
                failure(data , response as? HTTPURLResponse, error as? NSError)
            }
        }else {

            failure(data , response as? HTTPURLResponse, error as? NSError)

        }
        }.resume()

  }

}

下面是POST API的示例,用于调用登录API,参数为“emailaddress”和“password”,其中userEmailID和Userpassword分别作为两个字符串保存电子邮件和密码的值

您可以在视图控制器中的任何位置调用此POST API,如下所示:

self.postLoginCall(url:“您的post方法url”)示例:self.postLoginCall(url:)


大家好,我在下面分享了一个函数示例,该函数使用SWIFT 5+在POST中发出请求

此函数允许您以[[String:String]]和Int的形式发送带有API入口点和参数的POST请求,以确定输出操作

对于输出动作,我们调用一个带有开关盒的函数

操作非常简单。您必须将这两个函数放在一个类中

func MGSetRequestApi(endpoint: String, parameters: [[String: String]], MGSetAction: Int) -> String {

    var setReturn: String!
    let semaphore = DispatchSemaphore (value: 0)
    var MGGetParam: String! = ""

    for gate in parameters {

        for (key, value) in gate {
            let myParam = key + "=" + value + "&"
            MGGetParam.append(contentsOf: myParam)
        }
    }
            
    let postData =  MGGetParam.data(using: .utf8)

    var request = URLRequest(url: URL(string: endpoint)!,timeoutInterval: 10000)
    request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")

    request.httpMethod = "POST"
    request.httpBody = postData

    let task = URLSession.shared.dataTask(with: request) { data, response, error in
            guard let data = data else {
                    print(String(describing: error))
                    semaphore.signal()
                    return
            }
            print(String(data: data, encoding: .utf8)!)
            setReturn = String(data: data, encoding: .utf8)!

        DispatchQueue.main.async {
            self.MGRequestAction(MGGetIdRq: MGSetAction, MGGetData: setReturn)
        }
        semaphore.signal()

    }

    task.resume()
    semaphore.wait()
    return setReturn
}
然后实现此功能以管理输出

func MGRequestAction(MGGetIdRq: Int, MGGetData: String) {
    
    switch MGGetIdRq {
        case 1:
            // Do something here
        case 2:
            // Do something else here
        case 3:
            // Do something else here again
        default:
            print("Set default action");
    }
    
}
如何使用这个,你有两种可能,第一种是处理什么函数

MGSetRequestApi(端点:字符串,参数:[[String:String]],MGSetAction:Int)->String

返回(字符串)或通过函数传递

MGRequestAction(MGGetIdRq:Int,MGGetData:String)

它将调用Json解析函数

函数的参数为Int,用于选择操作和请求返回的字符串

现在要使用它,请执行以下操作:

_ =  MGSetRequestApi(endpoint: MY_END_POINT_API,
                     parameters: [["KEY_1": "VALUE 1"],
                                 ["KEY_2": "VALUE 2"],
                                 ["KEY_3": "VALUE 3"],
                                 ["KEY_4": "VALUE 4"]],
                     MGSetAction: 3)

这段代码对我不起作用,但我将请求传递给session.dataTask。成功了。当我像这样传递参数时,它不会在http post请求中传递。为什么?当我在服务器上看到它时,它是
POST,/validate receipt data,{}
。。。。。请帮助我。请打开一个新问题,提供更多关于您的问题的详细信息。这很简单。谢谢@Balaji Galave我如何设置标题并在post方法中传递身体中的东西?
func MGRequestAction(MGGetIdRq: Int, MGGetData: String) {
    
    switch MGGetIdRq {
        case 1:
            // Do something here
        case 2:
            // Do something else here
        case 3:
            // Do something else here again
        default:
            print("Set default action");
    }
    
}
_ =  MGSetRequestApi(endpoint: MY_END_POINT_API,
                     parameters: [["KEY_1": "VALUE 1"],
                                 ["KEY_2": "VALUE 2"],
                                 ["KEY_3": "VALUE 3"],
                                 ["KEY_4": "VALUE 4"]],
                     MGSetAction: 3)