发送Http Post请求在IoS中返回500状态代码

时间:2019-12-20 07:11:22

标签: ios swift post https request

我正在尝试在Http Post请求中发送NSData类型(转换为字符串)的Receipt数据以及其他一些类型为String的参数。

func receiptValidation(productId:String)
    {

             let SUBSCRIPTION_SECRET = My_SecretKey
             let defaults = UserDefaults.standard
             let receiptPath = Bundle.main.appStoreReceiptURL?.path
             if FileManager.default.fileExists(atPath: receiptPath!){
                 var receiptData:NSData?
                 do{
                     receiptData = try NSData(contentsOf: Bundle.main.appStoreReceiptURL!, options: NSData.ReadingOptions.alwaysMapped)
                 }
                 catch{
                     print("ERROR: " + error.localizedDescription)
                 }
                 let receiptString = receiptData?.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))
                // let base64encodedReceipt = receiptData?.base64EncodedString(options: NSData.Base64EncodingOptions.endLineWithCarriageReturn)
           let requestDictionary = ["receipt-data":receiptString!,"password":SUBSCRIPTION_SECRET]

                 guard JSONSerialization.isValidJSONObject(requestDictionary) else {  print("requestDictionary is not valid JSON");  return }
                 do {

                     let requestData = try JSONSerialization.data(withJSONObject: requestDictionary)
                   let requestDataString = NSString(data: requestData, encoding: String.Encoding.utf8.rawValue)

                    //https://<apiProxyServer>:<apiProxyServerPort>/api/validate-receipt-data

                    let URLForApplication:String = String(format:"%@/api/validate-receipt-data",opcodeDetails["apiProxyBaseUrl"]!)  // this works but as noted above it's best to use your own trusted server
                     let url:URL! = URL.init(string: URLForApplication)
                    var request = URLRequest.init(url: url)
                     request.httpMethod = "POST"
                     let configure = URLSessionConfiguration.background(withIdentifier: Bundle.main.bundleIdentifier!)
                    var postString:[String:Any]=[
                        "receiptData": requestDataString
                        "deviceType":"IOS",
                        "subscriberId":encodeString(normalString: defaults.array(forKey: "userDetails")?.first as! String),
                        "password":encodeString(normalString: defaults.array(forKey: "userDetails")?.last as! String),
                        "productId":encodeString(normalString: productId),
                        "code":opcodeDetails["opCode"]!
                    ]
                     do {
                       let receiptData = try JSONSerialization.data(withJSONObject: postString)
                         request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
                        request.httpBody = receiptData
                       } catch let error {
                           print(error.localizedDescription)
                       }
                let session = URLSession(configuration:configure,
                                          delegate:applicationDelegate.application,
                                          delegateQueue:OperationQueue.main)
                    session1 = session

                 let connection = session1?.dataTask(with: request)

                 connection?.resume()

                 } catch let error as NSError {
                     print("json serialization failed with error: \(error)")
                 }

             }

    }

encodeString()是已定义的方法

func encodeString(normalString:String) -> String {

        let allowedCharacters = CharacterSet.letters

        let encodedString:String!=normalString.addingPercentEncoding(withAllowedCharacters: allowedCharacters)

        return encodedString

    }

服务器端没有问题。但是我无法获得成功响应,我得到的是{"status":"failure","statusCode":500,"message":"Resource url not found!"}。我在用此代码做什么错误?请任何人帮助我。谢谢您。 / p>

1 个答案:

答案 0 :(得分:0)

尝试在网址末尾附加'/'

例如:  google.com/api/postgoogle.com/api/post/不同,在Django-Backend的情况下,斜杠有时会产生500错误。