신속하게 BODY로 POST 요청을 보내는 방법
Alamofire를 사용하여 신속하게 본문에 게시물 요청을하려고합니다.
내 json 본문은 다음과 같습니다.
{
"IdQuiz" : 102,
"IdUser" : "iosclient",
"User" : "iosclient",
"List":[
{
"IdQuestion" : 5,
"IdProposition": 2,
"Time" : 32
},
{
"IdQuestion" : 4,
"IdProposition": 3,
"Time" : 9
}
]
}
let
list
다음과 같은 NSDictionnary 로 만들려고합니다 .
[[Time: 30, IdQuestion: 6510, idProposition: 10], [Time: 30, IdQuestion: 8284, idProposition: 10]]
Alamofire를 사용한 내 요청은 다음과 같습니다.
Alamofire.request(.POST, "http://myserver.com", parameters: ["IdQuiz":"102","IdUser":"iOSclient","User":"iOSClient","List":list ], encoding: .JSON)
.response { request, response, data, error in
let dataString = NSString(data: data!, encoding:NSUTF8StringEncoding)
println(dataString)
}
요청에 오류가 있으며 문제가 사전 목록에 있다고 생각합니다. 목록없이 요청하면 제대로 작동하므로 어떤 아이디어가 있습니까?
제안 된 솔루션을 시도했지만 동일한 문제에 직면하고 있습니다.
let json = ["List":list,"IdQuiz":"102","IdUser":"iOSclient","UserInformation":"iOSClient"]
let data = NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions.PrettyPrinted,error:nil)
let jsons = NSString(data: data!, encoding: NSUTF8StringEncoding)
Alamofire.request(.POST, "http://myserver.com", parameters: [:], encoding: .Custom({
(convertible, params) in
var mutableRequest = convertible.URLRequest.copy() as! NSMutableURLRequest
mutableRequest.HTTPBody = jsons!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
return (mutableRequest, nil)
}))
.response { request, response, data, error in
let dataString = NSString(data: data!, encoding:NSUTF8StringEncoding)
println(dataString)
}
당신은 가깝습니다. 매개 변수 사전 형식이 올바르지 않습니다. 다음을 시도해야합니다.
let parameters: [String: AnyObject] = [
"IdQuiz" : 102,
"IdUser" : "iosclient",
"User" : "iosclient",
"List": [
[
"IdQuestion" : 5,
"IdProposition": 2,
"Time" : 32
],
[
"IdQuestion" : 4,
"IdProposition": 3,
"Time" : 9
]
]
]
Alamofire.request(.POST, "http://myserver.com", parameters: parameters, encoding: .JSON)
.responseJSON { request, response, JSON, error in
print(response)
print(JSON)
print(error)
}
문제가 해결 되었기를 바랍니다. 그렇지 않은 경우 회신 해 주시면 그에 따라 답변을 조정하겠습니다.
Alamofire v4.0 이상을 사용하는 경우 허용되는 답변은 다음과 같습니다.
let parameters: [String: Any] = [
"IdQuiz" : 102,
"IdUser" : "iosclient",
"User" : "iosclient",
"List": [
[
"IdQuestion" : 5,
"IdProposition": 2,
"Time" : 32
],
[
"IdQuestion" : 4,
"IdProposition": 3,
"Time" : 9
]
]
]
Alamofire.request("http://myserver.com", method: .post, parameters: parameters, encoding: JSONEncoding.default)
.responseJSON { response in
print(response)
}
나는 (아마도 제외되지 같은 다른 답변의 지금까지 수행 한 그들 중 하나는 JSON 자체의 구조에 대해 다시 연재, 또는 관리하는 단지를 들어, JSON을 역 직렬화 할 필요로하기 때문에, SwiftDeveloper에 의해).
정확한 답은 또 다른 질문에 afrodev에 의해 게시되었습니다. 가서 찬성해야합니다.
아래는 약간의 변경 사항 (주로 명시 적 UTF-8 문자 집합)이있는 내 적응입니다.
let urlString = "https://example.org/some/api"
let json = "{\"What\":\"Ever\"}"
let url = URL(string: urlString)!
let jsonData = json.data(using: .utf8, allowLossyConversion: false)!
var request = URLRequest(url: url)
request.httpMethod = HTTPMethod.post.rawValue
request.setValue("application/json; charset=UTF-8", forHTTPHeaderField: "Content-Type")
request.httpBody = jsonData
Alamofire.request(request).responseJSON {
(response) in
print(response)
}
Xcode 8.X, Swift 3.X
쉬운 사용;
let params:NSMutableDictionary? = [
"IdQuiz" : 102,
"IdUser" : "iosclient",
"User" : "iosclient",
"List": [
[
"IdQuestion" : 5,
"IdProposition": 2,
"Time" : 32
],
[
"IdQuestion" : 4,
"IdProposition": 3,
"Time" : 9
]
]
];
let ulr = NSURL(string:"http://myserver.com" as String)
let request = NSMutableURLRequest(url: ulr! as URL)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let data = try! JSONSerialization.data(withJSONObject: params!, options: JSONSerialization.WritingOptions.prettyPrinted)
let json = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
if let json = json {
print(json)
}
request.httpBody = json!.data(using: String.Encoding.utf8.rawValue);
Alamofire.request(request as! URLRequestConvertible)
.responseJSON { response in
// do whatever you want here
print(response.request)
print(response.response)
print(response.data)
print(response.result)
}
나를 위해 작동하지 않았기 때문에 SwiftDeveloper 의 답변을 약간 편집 했습니다. Alamofire 유효성 검사도 추가했습니다.
let body: NSMutableDictionary? = [
"name": "\(nameLabel.text!)",
"phone": "\(phoneLabel.text!))"]
let url = NSURL(string: "http://server.com" as String)
var request = URLRequest(url: url! as URL)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let data = try! JSONSerialization.data(withJSONObject: body!, options: JSONSerialization.WritingOptions.prettyPrinted)
let json = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
if let json = json {
print(json)
}
request.httpBody = json!.data(using: String.Encoding.utf8.rawValue)
let alamoRequest = Alamofire.request(request as URLRequestConvertible)
alamoRequest.validate(statusCode: 200..<300)
alamoRequest.responseString { response in
switch response.result {
case .success:
...
case .failure(let error):
...
}
}
알리고 싶은 변경 사항이 거의 없습니다. 이제부터는 응답 객체에서 요청, JSON, 오류에 액세스 할 수 있습니다.
let urlstring = "Add URL String here"
let parameters: [String: AnyObject] = [
"IdQuiz" : 102,
"IdUser" : "iosclient",
"User" : "iosclient",
"List": [
[
"IdQuestion" : 5,
"IdProposition": 2,
"Time" : 32
],
[
"IdQuestion" : 4,
"IdProposition": 3,
"Time" : 9
]
]
]
Alamofire.request(.POST, urlstring, parameters: parameters, encoding: .JSON).responseJSON { response in
print(response.request) // original URL request
print(response.response) // URL response
print(response.data) // server data
print(response.result) // result of response serialization
if let JSON = response.result.value {
print("JSON: \(JSON)")
}
response.result.error
}
당신이 사용하는 경우 swift4
와 Alamofire v4.0
그 허용 코드는 다음과 같을 것이다 :
let parameters: Parameters = [ "username" : email.text!, "password" : password.text! ]
let urlString = "https://api.harridev.com/api/v1/login"
let url = URL.init(string: urlString)
Alamofire.request(url!, method: .put, parameters: , encoding: JSONEncoding.default, headers: nil).responseJSON { response in
switch response.result
{
case .success(let json):
let jsonData = json as! Any
print(jsonData)
case .failure(let error):
self.errorFailer(error: error)
}
}
다음은 Json 인코딩 및 헤더가있는 매개 변수가 필요한 swift로 Http POST 요청을 생성 한 방법입니다.
POST, GET, PUT, DELETE 등과 같은 모든 유형의 요청을 포함하는 공유 인스턴스로 API 클라이언트 BKCAPIClient를 생성했습니다.
func postRequest(url:String, params:Parameters?, headers:HTTPHeaders?, completion:@escaping (_ responseData:Result<Any>?, _ error:Error?)->Void){
Alamofire.request(url, method: .post, parameters: params, encoding: JSONEncoding.default, headers: headers).responseJSON {
response in
guard response.result.isSuccess,
(response.result.value != nil) else {
debugPrint("Error while fetching data: \(String(describing: response.result.error))")
completion(nil,response.result.error)
return
}
completion(response.result,nil)
}
}
특정 요청에 필요한 모든 데이터를 포함하고 완료 블록 내에 구문 분석 논리도 포함하는 Operation 클래스를 생성했습니다.
func requestAccountOperation(completion: @escaping ( (_ result:Any?, _ error:Error?) -> Void)){
BKCApiClient.shared.postRequest(url: BKCConstants().bkcUrl, params: self.parametrs(), headers: self.headers()) { (result, error) in
if(error != nil){
//Parse and save to DB/Singletons.
}
completion(result, error)
}
}
func parametrs()->Parameters{
return ["userid”:”xnmtyrdx”,”bcode":"HDF"] as Parameters
}
func headers()->HTTPHeaders{
return ["Authorization": "Basic bXl1c2VyOm15cGFzcw",
"Content-Type": "application/json"] as HTTPHeaders
}
이 데이터가 필요한 뷰 컨트롤러에서 API 호출
func callToAPIOperation(){
let accOperation: AccountRequestOperation = AccountRequestOperation()
accOperation.requestAccountOperation{(result, error) in
}}
Alamofire는 POST, 매개 변수 및 헤더로 데이터를 가져옵니다.
func feedbackApi(){
DispatchQueue.main.async {
let headers = [
"Content-Type": "application/x-www-form-urlencoded",
"Authorization": "------"
]
let url = URL(string: "---------")
var parameters = [String:AnyObject]()
parameters = [
"device_id":"-----" as AnyObject,
"user_id":"----" as AnyObject,
"cinema_id":"-----" as AnyObject,
"session_id":"-----" as AnyObject,
]
Alamofire.request(url!, method: .post, parameters: parameters,headers:headers).responseJSON { response in
switch response.result{
case.success(let data):
self.myResponse = JSON(data)
print(self.myResponse as Any)
let slide = self.myResponse!["sliders"]
print(slide)
print(slide.count)
for i in 0..<slide.count{
let single = Sliders(sliderJson: slide[i])
self.slidersArray.append(single)
}
DispatchQueue.main.async {
self.getSliderCollection.reloadData()
}
case .failure(let error):
print("dddd",error)
}
}
}
}
func get_Contact_list()
{
ApiUtillity.sharedInstance.showSVProgressHUD(text: "Loading..")
let cont_nunber = contact_array as NSArray
print(cont_nunber)
let token = UserDefaults.standard.string(forKey: "vAuthToken")!
let apiToken = "Bearer \(token)"
let headers = [
"Vauthtoken": apiToken,
"content-type": "application/json"
]
let myArray: [Any] = cont_nunber as! [Any]
let jsonData: Data? = try? JSONSerialization.data(withJSONObject: myArray, options: .prettyPrinted)
// var jsonString: String = nil
var jsonString = String()
if let aData = jsonData {
jsonString = String(data: aData, encoding: .utf8)!
}
let url1 = "URL"
var request = URLRequest(url: URL(string: url1)!)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = jsonData as! Data
// let session = URLSession.shared
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else {
print("error=\(String(describing: error))")
ApiUtillity.sharedInstance.dismissSVProgressHUD()
return
}
print("response = \(String(describing: response))")
let responseString = String(data: data, encoding: .utf8)
print("responseString = \(String(describing: responseString))")
let json = self.convertStringToDictionary(text: responseString!)! as NSDictionary
print(json)
let status = json.value(forKey: "status") as! Int
if status == 200
{
let array = (json.value(forKey: "data") as! NSArray).mutableCopy() as! NSMutableArray
}
else if status == 401
{
ApiUtillity.sharedInstance.dismissSVProgressHUD()
}
else
{
ApiUtillity.sharedInstance.dismissSVProgressHUD()
}
}
task.resume()
}
func convertStringToDictionary(text: String) -> [String:AnyObject]? {
if let data = text.data(using: String.Encoding.utf8) {
do {
let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String:AnyObject]
return json
} catch {
print("Something went wrong")
}
}
return nil
}
모델과 물건을 진행하는 방법을 궁금해하는 사람은 아래를 참조하십시오.
var itemArr: [Dictionary<String, String>] = []
for model in models {
let object = ["param1": model.param1,
"param2": model.param2]
itemArr.append(object as! [String : String])
}
let param = ["field1": someValue,
"field2": someValue,
"field3": itemArr] as [String : Any]
let url: URLConvertible = "http://------"
Alamofire.request(url, method: .post, parameters: param, encoding: JSONEncoding.default)
.responseJSON { response in
self.isLoading = false
switch response.result {
case .success:
break
case .failure:
break
}
}
{
if Reachability.isConnectedToNetwork() == true
{
let hud = MBProgressHUD.showAdded(to: self.view, animated: true)
hud.mode = .indeterminate
hud.label.text = "Loading"
hud.animationType = .fade
var request = URLRequest(url: URL(string: "http://skandal24.serv.si/ws/webservice/forgot_password")!)
request.httpMethod = "POST"
let postString = String(format: "email=%@&lang=%@", arguments: [txt_emailVirify.text!, language!])
print(postString)
emailString = txt_emailVirify.text!
request.httpBody = postString.data(using: .utf8)
request.addValue("delta141forceSEAL8PARA9MARCOSBRAHMOS", forHTTPHeaderField: "Authorization")
request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
Alamofire.request(request).responseJSON { response in
//Your code
print(response.value)
if response.response?.statusCode == 200
{
let dictionary = (response.value) as! AnyObject
let status = dictionary.value(forKey: "status") as! String
let sts = Int(status)
DispatchQueue.main.async()
{
if sts == 200
{
}
}
}
else
{
}
}
}
else
{
}
}
참고 URL : https://stackoverflow.com/questions/31982513/how-to-send-a-post-request-with-body-in-swift
'code' 카테고리의 다른 글
Windows 클립 보드에 복사하는 cygwin 명령 (0) | 2020.10.06 |
---|---|
(사용되지 않음) onOptionsItemSelected 조각이 호출되지 않음 (0) | 2020.10.06 |
TextInputLayout을 사용할 때 @ id / visible 리소스를 확인할 수 없습니다. (0) | 2020.10.06 |
Android-브로드 캐스트 수신기 onReceive ()에서 컨텍스트 가져 오기 (0) | 2020.10.06 |
Entity Framework-코드 우선-목록을 저장할 수 없음 (0) | 2020.10.06 |