2017-03-07 14 views
-1

私は現在取り組んでいるプロジェクトで大きな問題を抱えています。私は間違っていますか?Swift 3 httpリクエストとレスポンス

私はURLSessionについてさまざまな場所を読んできましたが、それらのすべてが古いと思われ、NSURLSessionを参照しています。私は彼らがかなり似ていると思っていましたが、私のような初心者のためには、私がやっていることは働いていないし、私はコントローラで仕事をしているので、私が見つけた解決策が嫌いだ。

http://swiftdeveloperblog.com/image-upload-with-progress-bar-example-in-swift/ これは一例です。私はPHPスクリプトを使用していますが、呼び出すことができ、自由に使用できるネットワーキング層を作りたかったのです。私はこのAPIをどのように使用するかについて知ることができる場所からの良いリソースが不足しています。

私が見つけたすべての場所は、上記のリンクと似ています。いくつかの新しいもパターンを実際にこのAPIを使用する方法を説明せずに続くようです。

私はデリゲートパターンを初めて知っています。実際にはこのApiで頻繁に使用されていることがわかりましたが、IDEAの方法や理由はありません。

私はこのような何かをしようとしました::

public class NetworkPostRequestor:NSObject,NetworkPostRequestingProtocol,URLSessionTaskDelegate,URLSessionDataDelegate 
{ 
    public var _response:HTTPURLResponse 
    public override init() 
    { 
     _response = HTTPURLResponse() 
    } 
    public func post(data: Data, url: URL) 
    { 
     var request = URLRequest(url: url) 
     request.httpMethod = "POST" 
     request.setValue("Keep-Alive", forHTTPHeaderField: "Connection") 
     let configuration = URLSessionConfiguration.default 
     let session = URLSession(configuration: configuration,delegate: self, delegateQueue: OperationQueue.main) 
     let task = session.uploadTask(with: request, from: data) 
     task.resume() 

    } 
    public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) 
    { 
     _response = response as! HTTPURLResponse 
    } 
} 

しかし、私もPHPserverを打つことはありません は基本的に私はここにこの問題を解決するための私の方法を見つけるのを助ける必要があります。ヒットが端末内にこのような何かを言うだろうサーバー:

[Tue Mar 7 11:43:20 2017] 192.168.250.100:64265 [200]:/
    [Tue Mar 7 11:43:20 2017] 192.168.250.100:64266 [404]: /favicon.ico - No such file or directory 

まあ、私は私のブラウザでそれをヒットし、それとのイメージがないときです。しかし、少なくとも私は、それがヒットした場合、端末で何かを書き込むことを知っています。何も起こりませんそして私にこのapiを教えるためのリソースがなければ私はこれを修正する方法を学ぶことはないと思います。

私はスウィフト3とXcode 8.2.1を使用してい

編集:

私はクラスにこのメソッドを追加し、私はそれを一つ一つ時間をヒットしていることがわかりました。

public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) 
{ 
    _error = error.debugDescription 
} 

デバッグ記述は、この文字列は「いくつかの」

+0

誰かがマイナスをくれた理由を知りたいですか?私がマイナス投票をした理由を整理するために私のポストを変えることができる何らかの方法はありますか? – Helbo

+0

投稿に間違いはありません。質問は有効です。あなたが試したことに関する説明を追加し、あなたが持っている結果を記述しました。スニペットが追加され、問題はうまくフォーマットされています... –

+0

@AshleyMillsは、あなたが指摘した部分を削除しようとしました。私の事実を知らせてくれてありがとう – Helbo

答えて

1

私は仕事で、この正確な手順を使用していないのではなく、コールバックでメソッドを使用したことがありません。私はバックグラウンドで違いがあるはずだとは分かりません。

ので、セッションを生成するために(あなたにかなり近いと思われる):

let configuration = URLSessionConfiguration.default 
let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main) 

その後、私は愚かな十分なコンストラクタでURLを必要とする要求を生成:

var request = URLRequest(url: URL(string: "www.nil.com")!) // can't initialize without url 
request.url = nil 

は、クエリとURLの追加パラメータ(URLを設定するだけで、いくつかのケースを処理するツールがあります):

fileprivate func injectQueryParameters(request: inout URLRequest) { 
     if let query = queryParameters.urlEncodedString { 
      let toReturn = endpoint.url + "?" + query 
      if let url = URL(string: toReturn) { 
       request.url = url 
      } else { 
       print("Cannot prepare url: \(toReturn)") 
      } 
     } else { 
      let toReturn = endpoint.url 
      if let url = URL(string: toReturn) { 
       request.url = url 
      } else { 
       print("Cannot prepare url: \(toReturn)") 
      } 
     } 
    } 

次に、フォームのパラメータ。私たちは、主にJSONを使用しますが、何がここに行く:

fileprivate func injectFormParameters(request: inout URLRequest) { 
     if let data = rawFormData { 
      request.httpBody = data 
     } else if let data = formParameters.urlEncodedString?.data(using: .utf8) { 
      request.httpBody = data 
     } 
    } 

やヘッダ:

fileprivate func injectHeaders(request: inout URLRequest) { 
     headers._parameters.forEach { (key, value) in 
      if let stringValue = value as? String { 
       request.setValue(stringValue, forHTTPHeaderField: key) 
      } 
     } 
    } 

だから、最後に全体のコールのようなものになります。

class func performRequest(request: URLRequest, callback: (([String: Any]?, NSError?) -> Void)?) { 
     let configuration = URLSessionConfiguration.default 
     let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main) 

     let task = session.dataTask(with: request) { data, response, error in 
      // Response is sent here 
      if let data = data { 
       callback?((try? JSONSerialization.jsonObject(with: data, options: .allowFragments)) as [String: Any]?, error) 
      } else { 
       callback?(nil, error) 
      } 
     } 
     task.resume() 
    } 

を私はこれがあなたを置く願っています適切なトラックに。一般的に興味のあるオープンソースライブラリがいくつかあります。Alamofireはおそらくほとんどの場合まだ使用されています。

+0

これをやっているアップロードの進捗状況を監視することができますか?私はそれがアップロードにかかる時間の間に進行状況バーを抽出することができる必要があります。 現在、データを送信するだけで問題が発生します。XD – Helbo

+0

URLSessionTaskDelegateはそれらを受信できるはずです。その1つを自己への代理人として使ってみてください。しかし、最初に成功したアップロードから始めてから、機能を拡張して進捗状況を受け取ることができます。また、セキュリティで保護されていないサーバー(http)に接続している場合、任意の負荷を許可するためにplistにファイルを含める必要があります。 –

+0

私は送信するために代理人を使用しない場合、私はまだ別の場所で個々のファイルの進捗状況の更新を受け取ることができます。 ? URLSessionTaskDelegateを呼び出すだけです。 確かに私はこれを行いました:)私がhttps上でhttpを選択しているのは、このアプリケーションが保護されたバブルの内側で実行されるからです。 – Helbo

関連する問題