Sept 15, 2021, TIL (Today I Learned) - HTTPURLResponse, MIMEType, TroubleShooting
16203 ワード
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ドキュメントをよく読んで開発する開発者になるように努力します.
Reference
この問題について(Sept 15, 2021, TIL (Today I Learned) - HTTPURLResponse, MIMEType, TroubleShooting), 我々は、より多くの情報をここで見つけました
https://velog.io/@inwoodev/Sept-15-2021-TIL-Today-I-Learned-HTTPURLResponse-MIMEType-TroubleShooting
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
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창 띄우기
}
}
}
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)
}
})
}
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()
}
if let mimeType = successfulResponse.mimeType,
mimeType == "application/json" {
completionHandler(.success(successfulResponse))
}
Reference
この問題について(Sept 15, 2021, TIL (Today I Learned) - HTTPURLResponse, MIMEType, TroubleShooting), 我々は、より多くの情報をここで見つけました https://velog.io/@inwoodev/Sept-15-2021-TIL-Today-I-Learned-HTTPURLResponse-MIMEType-TroubleShootingテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol