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)