Не найдено ни одного ресурса HTTP, соответствующего веб-интерфейсу URI запроса с использованием ASP.NET для ios Swift - PullRequest
0 голосов
/ 07 марта 2019

Мне нужно отправить запрос POST на сервер, и это параметры

let params : NSDictionary = ["userid":"\(userID)","sessionid":"\(sessionID)","site_id": "\(siteIDParam)", "latitude":"\(currentlatitude)", "longitude":"\(currentlongitude)", "action": "1", "comments":commentTextView.text ?? ""]

Но проблема в том, что мне нужно отправить изображение в виде байтового массива, и я использую следующий код (Swift 3)

func uploadImageRequest(image: UIImage? , urlString: String, imageName : String ,param: [String: AnyObject]? , completion:@escaping(_ success:Bool , _ object : AnyObject?) -> ())
{
    let url = NSURL(string: urlString)
    let request = NSMutableURLRequest(url: url! as URL)
    request.httpMethod = "POST"
    let boundary = generateBoundaryString()
    //define the multipart request type
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
    if (image == nil)
    {
        return
    }
    let image_data = UIImageJPEGRepresentation(image!, 0.5)
    if(image_data == nil)
    {
        return
    }
    let body = NSMutableData()
    let fname = "photo.png"
    let mimetype = "image/*"
    body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
    body.append("Content-Disposition:form-data; name=\"\(imageName)\"; filename=\"\(fname)\"\r\n".data(using: String.Encoding.utf8)!)
    body.append("Content-Type: \(mimetype)\r\n\r\n".data(using: String.Encoding.utf8)!)
    body.append(image_data!)
    body.append("\r\n".data(using: String.Encoding.utf8)!)
    body.append("--\(boundary)--\r\n".data(using: String.Encoding.utf8)!)
    if param != nil {
        for (key, value) in param! {
            body.append("--\(boundary)\r\n")
            body.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
            body.append("\(value)\r\n")
        }
    }
    request.httpBody = body as Data
    _ = URLSession.shared.dataTask(with: request as URLRequest) { (data, response, error) -> Void in
        if let data = data {
            // Json Response
            let json = try? JSONSerialization.jsonObject(with: data, options: [])
            // response.
            if let response = response as? HTTPURLResponse , 200...299 ~= response.statusCode {
                completion(true, json as AnyObject?)
            } else {
                completion(false, json as AnyObject?)
            }
        } else {
            completion(false, error?.localizedDescription as AnyObject?)
        }
        }.resume()
}

Изображение не конвертируется должным образом. Я предполагаю, что при срабатывании отклика не получится, и я получаю следующую ошибку

Message = "No HTTP resource was found that matches the request URI 

Этот API-интерфейс работает нормально на устройстве Android, но не можетбыть достигнутым в iOS.Я искал все ссылки, и я не мог найти правильное решение для этого.Я также пытался использовать Alamofire, но все же я получил ту же ошибку.

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Этот фрагмент кода помог мне решить мою проблему.Я просто отправляю свое изображение в виде файла, а остальные параметры - в виде строки, не добавляя его в составное тело.

        let imageData = UIImageJPEGRepresentation(userImage, 0.2)!
        let docDir = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
        let imageURL = docDir.appendingPathComponent("tmp.jpg")
        try! imageData.write(to: imageURL)
        let multipartHeaders = ["Content-Type":"multipart/form-data"]
        let paramString: String = "userid=\(userId)&action=1"

        Alamofire.upload(multipartFormData: { (multipartFormData) in
            multipartFormData.append(imageURL, withName: "profilepic")
        }, usingThreshold: SessionManager.multipartFormDataEncodingMemoryThreshold, to: URL(string: ATTENDANCE_URL+paramString)!, method: .post, headers:
        multipartHeaders) { (encodingResult) in
            switch encodingResult {
            case .success(let request, _, _):
                request.responseJSON(completionHandler: { (response) in
                    print(response.result.value)
                    let value = response.result.value as! [String: Any]
                    })
            case .failure(let error):
                print(error.localizedDescription)
            }
        }
0 голосов
/ 07 марта 2019

Вы должны установить ключ NSAllowsArbitraryLoads на YES в NSAppTransportSecurity dictionary в вашем файле .plist.

enter image description here

Вы можете легко сделать это, используя alamofire, используйте следующий код, чтобы сделать это.

 let multipartHeaders = ["Content-Type":"multipart/form-data"]
 let paramString: String = "parameters in json string..."

 Alamofire.upload(multipartFormData: { (multipartFormData) in
     multipartFormData.append(paramString.data(using: .utf8)!, withName: "json")
     multipartFormData.append(<imageDataHere>, withName: "myimage", fileName: "myImage.jpeg", mimeType: "image
jpeg")

 }, usingThreshold: SessionManager.multipartFormDataEncodingMemoryThreshold, to: url, method: .post, headers:
multipartHeader) { (encodingResult) in
     switch encodingResult {
     case .success(let request, _, _):
         request.responseJSON(completionHandler: { (response) in
             print(response)
         })
     case .failure(let error):
         print(error.localizedDescription)
     }
 }
...