Как я могу опубликовать запрос с заказом json в быстрый с alamofire? - PullRequest
0 голосов
/ 24 января 2020

Мне нужен способ оплаты для моего приложения, и я должен опубликовать запрос с данными JSON для связи с API. Все кажется правильным для меня. Я не могу найти ни одной ошибки в своем коде, но я предполагаю, что JSON не отправлять по порядку. Это важно? Потому что ответ сказал неудачу, но я не могу найти ничего другого. Если заказ JSON важен, как я могу это сделать? Я новичок в скором времени, пожалуйста, помогите мне. Вот мой код:

 func mainRequestForPayment() {

      )

        let headers: HTTPHeaders = [
            "accept": "application/json",
            "content-type": "application/json",
            "authorization": "\(self.authValue)",
            "x-iyzi-rnd": "\(self.randomString)",
            "cache-control": "no-cache"
        ]


        let url = "MY_URL"

        let parameters: [String: Any] = [
        "locale": "tr",
        "conversationId": "123456789",
        "price": "1.1",
        "paidPrice": "1.1",
        "installment": 1,
        "paymentChannel": "WEB",
        "basketId": "B67832",
        "paymentGroup": "PRODUCT",
        "paymentCard": [
            "cardHolderName": "CARD_HOLDER_NAME",
            "cardNumber": "CARD_NUMBER",
            "expireYear": "CARD_YEAR",
            "expireMonth": "01",
            "cvc": "123",
            "registerCard": 0
        ],
        "buyer": [
            "id": "BY789",
            "name": "John",
            "surname": "Doe",
            "identityNumber": "74300864791",
            "email": "email@email.com",
            "gsmNumber": "+905350000000",
            "registrationAddress": "Nidakule Göztepe, Merdivenköy Mah. Bora Sok. No:1",
            "city": "Istanbul",
            "country": "Turkey",
            "zipCode": "34732",
            "ip": "85.34.78.112"
        ],
        "shippingAddress": [
            "address": "Nidakule Göztepe, Merdivenköy Mah. Bora Sok. No:1",
            "zipCode": "34742",
            "contactName": "Jane Doe",
            "city": "Istanbul",
            "country": "Turkey"
        ],
        "billingAddress": [
            "address": "Nidakule Göztepe, Merdivenköy Mah. Bora Sok. No:1",
            "zipCode": "34742",
            "contactName": "Jane Doe",
            "city": "Istanbul",
            "country": "Turkey"
        ],
        "basketItems": [
            [
                "id": "BI101",
                "price": "0.3",
                "name": "Binocular",
                "category1": "Collectibles",
                "category2": "Accessories",
                "itemType": "PHYSICAL"
            ],
            [
                "id": "BI102",
                "price": "0.5",
                "name": "Game code",
                "category1": "Game",
                "category2": "Online Game Items",
                "itemType": "VIRTUAL"
            ],
            [
                "id": "BI103",
                "price": "0.2",
                "name": "Usb",
                "category1": "Electronics",
                "category2": "Usb / Cable",
                "itemType": "PHYSICAL"
            ]
        ],
        "currency": "TRY"
            ]


        Alamofire.request(url, method: .post, parameters: parameters , encoding: JSONEncoding.default, headers: headers)
            .responseJSON { (response) in
                print(parameters)
                switch response.result {
                case .success(let value):
                    let swiftyJson = JSON(value)
                    print ("return as JSON using swiftyJson is: \(swiftyJson)")
                case .failure(let error):
                    print ("error: \(error)")
                }

        }


    }

Где моя вина, которую я не вижу? И снова есть ли способ сделать заказ в почтовом запросе? Спасибо всем.

Я получаю ответ:

return as JSON using swiftyJson is: {
  "conversationId" : "123456789",
  "locale" : "tr",
  "errorCode" : "1000",
  "status" : "failure",
  "systemTime" : 1579858355103,
  "errorMessage" : "Invalid signature"
}

Ответы [ 2 ]

0 голосов
/ 24 января 2020
Порядок

JSON обычно не важен, поскольку JSON spe c не определяет его как требование для JSON объектов, но некоторые плохо спроектированные серверные части требуют его. Вам действительно нужно проверить требования бэкэнда, с которым вы общаетесь.

Кроме того, тип Swift Dictionary произвольно упорядочен, и этот порядок может меняться как между запусками вашего приложения, так и между версиями Swift. используется для компиляции вашего кода.

Наконец, оба типа Swift JSONEncoder и Apple JSONSerialization не требуют строгого заказа. Самое большее, JSONSerialization предлагает опцию .sortedKeys, которая даст вам гарантированный (алфавитный) порядок, но это может быть не тот порядок, в котором вы объявили свои параметры. Использование альтернативного Encoder, если у вас есть Codable типы (которые я рекомендую вместо Swifty JSON), могут дать вам лучшую гарантию заказа, но вам нужно только позаботиться, если это требование вашего бэкэнда.

В качестве отступления, я предлагаю вам использовать свойства stati c HTTPHeader для вашего значения HTTPHeaders, вместо использования необработанных строк, это гораздо удобнее. Например:

let headers: HTTPHeaders = [.accept("application/json"),
                            .contentType("application/json")]
0 голосов
/ 24 января 2020

Используйте этот класс

////////////////////////////////////////// ////////

import Foundation

import UIKit

import Alamofire

class ServicesClass_New: NSObject {

var delegate : ServicesClassDelegate!

typealias CompletionBlock = (_ result : Dictionary<String, Any>?, _ error : Error?) -> Void
typealias CompletionDataBlock = (_ result : Data?) -> Void
typealias ProgressBlock = (_ progressData : Progress) -> Void

//MARK: Shared Instance

static let sharedInstance : ServicesClass = {
    let instance = ServicesClass()
    return instance
}()

static func getDataFromURlWith(url:String,parameters:Dictionary<String, Any>?, requestName:String,completionBlock : @escaping CompletionBlock)
{

    print("net available")
    Alamofire.request(url, method: .get, parameters: parameters, encoding: URLEncoding.default, headers: nil).responseJSON { (response) in

        switch(response.result) {
        case .success(_):
            if let data = response.result.value
            {
                //print(response.result.value!)
                //print(data)

                var dic : Dictionary<String,Any> = Dictionary()

                if data as? Array<Dictionary<String,Any>> != nil
                {
                    dic["data"] = data as? Array<Dictionary<String,Any>>
                    completionBlock(dic,nil)
                }
                else
                {
                    completionBlock(data as? Dictionary<String,Any>,nil)
                }
            }

            break

        case .failure(_):
            print(response.result.error!)
            completionBlock(nil ,response.result.error!)
            break

        }
    }

}

static func postDataFromURL(url:String,parameters:Dictionary<String, Any>?, requestName:String,completionBlock : @escaping CompletionBlock)
{
    print("net available")
    //application/json 
    //multipart/form-data
    let hders : HTTPHeaders = [ "Content-Type" : "application/json"] as [String : String]

    Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: hders).responseJSON { response in

        switch(response.result) {
        case .success(_):
            if let dict = response.result.value
            {
                let data = dict as! Dictionary<String,Any>

                // print(response.result.value!)
                // print(data)
                completionBlock(data as Dictionary,nil)
            }

            break

        case .failure(let error):
            print((error as NSError).localizedDescription)
            completionBlock(nil ,response.result.error!)
            print("\(error.localizedDescription)")

            break

        }
    }
}

static func downloadFile(strUrl : String, progressBlock : @escaping ProgressBlock, completionBlock : @escaping CompletionDataBlock)
{
    let utilityQueue = DispatchQueue.global(qos: .utility)

    Alamofire.request(URL.init(string: strUrl)!).downloadProgress(queue: utilityQueue, closure: { (progress) in

        progressBlock(progress)
    })
        .responseData { (response) in

            if let data = response.result.value
            {
                completionBlock(data)
            }
            else
            {
                completionBlock(nil)
            }
    }

}

static func uploadData(url:String,parameters:Dictionary<String, Any>,requestName:String,arrImg:[UIImage],arrVideos:[URL],completionBlock : @escaping CompletionBlock)
{

    print("net available")

    let hders = [

        "Content-Type": "application/json"
    ]

    Alamofire.upload(multipartFormData:
        {
            MultipartFormData in

            for img in arrImg
            {
                let imageData = UIImageJPEGRepresentation(img , 0.8)!
                MultipartFormData.append(imageData, withName: "image" , fileName:"file\(index).jpg", mimeType:"image/jpeg")
            }

            index = 0
            for video in arrVideos
            {
                index = index + 1
                var videoData : Data = Data()
                do
                {
                    videoData = try Data.init(contentsOf: URL.init(fileURLWithPath: video.path))
                    MultipartFormData.append(videoData, withName: "video", fileName:"file\(index).mp4",mimeType: "video/mp4")
                }
                catch
                {

                }
            }
            for (key, value) in parameters
            {
                MultipartFormData.append((value as! String).data(using: String.Encoding.utf8)!, withName: key)
            }

    }, to:url,method:.post,headers:hders, encodingCompletion: {
        encodingResult in

        //["content-type" : "application/json"]
        switch encodingResult
        {
        case .success(let upload, _, _):
            print("image uploaded")
            upload.responseJSON { response in

                if let JSON = response.result.value
                {
                    print("JSON: \(JSON)")
                }

                if let dict = response.result.value
                {
                    let data = dict as! Dictionary<String,Any>

                    print(response.result.value!)
                    print(data)

                    completionBlock(data as Dictionary,nil)

                }
            }

            break

        case .failure(let encodingError):
            completionBlock(nil ,encodingError)
            break
        }
    } )

}

}

/// вызовите протоколы, где вы хотите вызвать API. // Существует несколько методов, таких как: GET, POST ....

...