【问题标题】:Sending Http Post request returns 500 status code in IoS发送 Http Post 请求在 IoS 中返回 500 状态码
【发布时间】:2020-04-12 17:27:52
【问题描述】:

我正在尝试在 Http Post 请求中发送 NSData 类型的 Receipt 数据(转换为字符串)和其他几个字符串类型的参数。

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!"}。我对这段代码有什么错误?请任何人帮助我。提前致谢。

【问题讨论】:

    标签: ios swift post https request


    【解决方案1】:

    尝试在 URL 末尾附加 '/'

    例如: google.com/api/postgoogle.com/api/post/ 是不同的,斜杠有时会给出 500 错误,如果是 Django-Backend 的话。

    【讨论】:

      猜你喜欢
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多