没有找到与使用ASP.NET for ios Swift的请求URI web api匹配的HTTP资源

问题描述 投票:0回答:2

我需要向服务器发送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,但我仍然遇到了同样的错误。

ios .net swift api http
2个回答
0
投票

您必须在.plist文件中的NSAllowsArbitraryLoads YES下将NSAppTransportSecurity密钥设置为dictionary

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)
     }
 }

0
投票

这段代码帮助我解决了我的问题。我只是将我的图像作为文件发送,将剩余参数作为字符串发送,而不将其附加到我的多部分主体。

        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)
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.