【问题标题】:urlrequest not sending post requesturlrequest 不发送 post 请求
【发布时间】:2018-12-27 07:30:56
【问题描述】:

您好,我是 IOS 应用程序开发的新手。 我的代码是

func sendRequest<T: Decodable>(api: String, parameters: [String: String]? = nil, outputBlock: @escaping (T) -> () ) {
   
    guard let url = URL(string: "http://xxyyzz.com/appRegister.php") else {return}
    
    print("hitting : -", url.absoluteString)
    
    var request = URLRequest(url: url)
    
    request.httpMethod = "POST"
    
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    
    request.addValue("application/json", forHTTPHeaderField: "Accept")
  
    let newparam = ["name": "rr", "pass": "123456", "email": "rr@rr.com", "passConfirm":"123456"]
    
    let httpBody = try? JSONSerialization.data(withJSONObject: newparam)
    
    request.httpBody = httpBody
    
    if let data = request.httpBody, let str = String(data: data, encoding: String.Encoding.utf8) {
    
        print(str)
    
    }
    
    URLSession.shared.dataTask(with: request as URLRequest) { (data, response, error) in
    
        DispatchQueue.main.async {
        
            Indicator.shared.hideProgressView()
            
            if let err = error {
            
                print(err.localizedDescription)
                
                return
            
            }
            
            guard let data = data else {return}
            
            do {
            
                let obj = String(data: data, encoding: String.Encoding.utf8)
                
                print(obj ?? "oberrrrr")
            
            }
        
        }
        
        }.resume()

}

下面是控制台打印的代码结果

击中:-http://xxyyzz.com/appRegister.php {"email":"rr@rr.com","passConfirm":"123456","name":"rr","pass":"123456"}

{"error":"请输入所有字段。"}

url 和参数在邮递员上运行良好,这意味着我的代码中缺少它们。

【问题讨论】:

  • 请阅读Why is “Can someone help me?” not an actual question? 和关于提出好问题的指南:stackoverflow.com/help/how-to-ask 并调整您的问题以更具体
  • 在 POSTMAN 中,您可以获得 Swift 代码。它可能并不总是“一个好的代码”,但它应该可以工作并帮助您找出有什么区别。通常要比较两者,打印请求 URL、HeadersFields 和 HTTPBody 以检查哪一个不同。
  • 刚刚尝试使用邮递员代码并且代码已过时并且尝试解决错误时。一个数据变量用于 httpBody 之前从未定义过。
  • 在邮递员中显示你在做什么。此外,如果您使用相同的凭据在 Postman 中进行了注册,如果新用户想要使用相同的电子邮件或用户进行注册,这可能是服务器返回的标准错误?
  • 我总是使用不同的凭据,如果使用相同的条目,服务器会给出已创建用户的正确错误

标签: swift post urlsession urlrequest


【解决方案1】:

如果其他人面临这个问题,只是为了回答这个问题。 这段代码很好,但问题在于 php web-service,因为后端开发人员不接受 json 值作为参数,而是需要发送表单数据。 因此,这里可以进行两种类型的修复

  1. 通过添加在后端接受 json :-

    $postdata = file_get_contents("php://input"); $request = json_decode($postdata, true);

  2. 发送表单数据而不是 json

    func sendRequest<T: Decodable>(api: String, parameters: [String: Any]? = nil, outputBlock: @escaping (T) -> () ) {
    
    guard let url = URL(string: api) else {return}
    
    print("hitting : -", url.absoluteString)
    
    var request = URLRequest(url: url)  
    
    if let parameters = parameters {
    
        request.httpMethod = "POST"
    
        var postArr = [String]()
    
        for(key, value) in parameters
        {
            postArr.append(key + "=\(value)")
        }
    
        let postString = postArr.map { String($0) }.joined(separator: "&")
        request.httpBody = postString.data(using: .utf8)
    
        if let data = request.httpBody, let str = String(data: data, encoding: String.Encoding.utf8) {
            print(str)
        }
    
    }
    URLSession.shared.dataTask(with: request) { (data, response, error) in
        DispatchQueue.main.async {
            Indicator.shared.hideProgressView()
            if let err = error {
                print(err.localizedDescription)
                return
            }
            guard let data = data else {return}
            do {
                let obj = try JSONDecoder().decode(T.self, from: data)
                outputBlock(obj)
            } catch let jsonErr {                    
                print(jsonErr)
            }
        }
        }.resume()
    

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 2017-07-13
    相关资源
    最近更新 更多