Sept 15, 2021, TIL (Today I Learned) - HTTPURLResponse, MIMEType, TroubleShooting


Truble:ネットワーク応答を受信できない理由...


詳細ページの右上にあるボタンをクリックし、alertウィンドウにパスワードを入力します.入力した値がサーバに存在するパスワード値と一致する場合は、「変更」ページに切り替えます.isPasswordValid()の方法を利用する.
private func isPasswordValid(_ passwordKeyAndValue: [String: String?]) {
        networkManager.patchSingleItem(url: "\(OpenMarketAPI.urlForSingleItemToGetPatchOrDelete)\(itemID)", texts: passwordKeyAndValue, images: nil) { response in
            if (200...299).contains(response.statusCode) {
                print("valid password")
                // 수정페이지로 전환
            } else {
                print("invalid password")
                // 패스워드 재입력 alert창 띄우기
            }
        }
    }
でも….死んでもresponseの和弦は吹かない...
この方法のnetworkManagerの方法も見ました
func patchSingleItem(url: String, texts: [String : Any?], images: [UIImage]?, completionHandler: @escaping (HTTPURLResponse) -> Void) {
        openMarketItemMultipartFormDataTask(httpMethod: .patch, url: url, texts: texts, imageList: images, completionHandler: { result in
            switch result {
            case .success(let response):
                NSLog("item patch succeeded with response code: \(response.statusCode)")
                completionHandler(response)
            case .failure(let networkError):
                NSLog(networkError.description)
            }
        })
    }
うん...patchメソッドは、HTTPURLSessionを正常にもたらすようです.もう少し下へopenMarketItemMultipartFormDataTask()は問題ですか?
private func openMarketItemMultipartFormDataTask(httpMethod: HTTPMethods, url: String, texts: [String : Any?], imageList: [UIImage]?, completionHandler: @escaping(_ result: Result <HTTPURLResponse, NetworkResponseError>) -> Void) {
        
        guard let validURL = URL(string: url) else { return }
        
        var request = URLRequest(url: validURL)
        request.httpMethod = httpMethod.description
        request.httpBody = buildMultipartFormData(texts, imageList)
        
        request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
        
        dataTask = urlSession.dataTask(with: request) { data, response, error in
            if let error = error {
                NSLog(error.localizedDescription)
            }
            
            guard let successfulResponse = response as? HTTPURLResponse,
                  (200...299).contains(successfulResponse.statusCode) else {
                let failedResponse = response as? HTTPURLResponse
                
                completionHandler(.failure(NetworkResponseError.failed))
                return
            }
            
            if let mimeType = successfulResponse.mimeType,
               mimeType == "multipart/form-data" {
                completionHandler(.success(successfulResponse))
            }
        }
        dataTask?.resume()
    }
この方法に問題があるようなので、デバッグしてみました.ブレイクポイントを表装してみます😆

TroubleShooting:APIドキュメントをよく読む



なんてことだmimeタイプをチェックする部分では、サーバが送信するmimeタイプはapplication/jsonタイプで、サーバが送信するデータはmultipart/form-dataだと思います.
だから久しぶりにサーバーAPIドキュメントを見ました...
左のrequestbodyはmultipart/form-data右の応答はjson objectです

Common MIME typesのドキュメントを見てみると、やはりmimetypeはアプリケーション/jsonのはずです.
if let mimeType = successfulResponse.mimeType,
               mimeType == "application/json" {
                completionHandler(.success(successfulResponse))
            }
mimeteTypeがapplication.json型であるかどうかを判断するために論理を修正し、通常、CompletionHandlerが呼び出されたときに応答を正常に受信することができる.

終了時..。


APIドキュメントに慣れていないせいだ私たちはすでに多くの反省をして、これからもっとAPIドキュメントをよく読んで開発する開発者になるように努力します.