当只需要一个请求时,“dataTaskWithRequest”请求两次NSMutableRequest

时间:2017-02-20 12:26:53

标签: ios swift uiwebview nsmutableurlrequest

我有一个安全的webView,显示客户加载他的钱包。我传递安全信息MPIN(就像一次性密码)。

有问题
@IBOutlet weak var loading: UIActivityIndicatorView!

@IBOutlet var lblLoading: UILabel!


@IBOutlet weak var mob_webview: UIWebView!

override func viewDidLoad()
{
    super.viewDidLoad()
    mob_webview.hidden = true
    mob_webview.delegate=self
    cmmn.createDatabase()
    linkgot = cmmn.geturl()

   link="http://*****************************************.jsp?"

    let request = NSMutableURLRequest(URL: NSURL(string: link)!)
    request.HTTPMethod = "POST"
    let postString = "recharge_type=\(_catcode)&amount=\(_amountfiled_got)&mobileNo=\(cmmn.getPhoneNumber())&prePostLan=\(prePostLan)&stdCode=\(_stdCode)&accNo=\(accNo)&deduct_frm=B&rcMobileNum=\(_numberfiled_got)&mobOperator=\(_merch_code)&operator=\(_operatr)&rcType=\(_rec_type)&mpin=\(_mpin)"
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
        data, response, error in

        if error != nil {
            print("error=\(error)")
            return
        }

        print("response = \(response)")

        let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
        print("responseString = \(responseString)")
    }
    task.resume()
    mob_webview.loadRequest(request)







    // Do any additional setup after loading the view.
}
func webViewDidFinishLoad(webView_Pages: UIWebView)
{

    mob_webview.hidden = false
    loading.hidden = true
    lblLoading.hidden=true
    print("OK")

}

服务器日志中的响应: enter image description here enter image description here

在服务器中,如果用户错误地键入三次MPIN,则会被阻止。这是基于服务器中错误的MPIN命中数来完成的。由于某种原因,我的Web视图发出请求两次(即调用加载请求两次的链接),即使它只加载一次。假如客户输入错误的MPIN并加载Web视图,该链接被调用两次他失去2次机会输入正确的MPIN。我们APP的Android版本可以正常使用类似的请求。有什么理由吗?

3 个答案:

答案 0 :(得分:4)

阅读完问题后,我浏览了苹果参考文档。它说在加载webview中的每个帧后调用webViewDidFinishLoadHere is document

  

webViewDidFinishLoad:在Web视图完成加载框架后发送。

请与服务器核实,一次运行请求的数量。这是2或一个。还想知道代码中的打印状态执行print("response = \(response)")的时间。因为我没有安慰这个声明。

在您的问题中找到您调用NSURLSession dataTaskWithRequest并在Web视图中加载请求。这可能也是两次调用同一件事的问题。如果要在webview中打开请求,请不要使用NSURLSession任务请求。 通过评论task.resume()

来运行它

答案 1 :(得分:3)

task.resume()和mob_webview.loadRequest(请求)将运行两次请求。

您最好在loadRequest之前删除task.resume()。

答案 2 :(得分:1)

您要求NSMutableURLRequest两次:

  1. 您将其传递给URLSession的{​​{3}}方法。此方法在闭包中从请求中的URL返回数据。
  2. 您将其传递给UIWebView的{​​{3}}方法。此方法会在您UIWebView(您的mob_webview IBOutlet)的请求网址中加载内容。
  3. 要解决此问题,您需要删除URLSession代码或UIWebView代码。您删除的内容取决于您要对服务器的响应做什么 - 您是希望将其作为数据还是要将其加载到Webview中?如果您想将其作为数据,则应使用URLSession并移除UIWebView loadRequest。如果您想在网页浏览中加载,则应使用UIWebView并删除所有UISession代码。

    如果是您需要移除的URLSession代码,则应删除以下所有内容:

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
        data, response, error in
    
        if error != nil {
            print("error=\(error)")
            return
        }
    
        print("response = \(response)")
    
        let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
        print("responseString = \(responseString)")
    }
    task.resume()