Ios 如何在swift中使用HTTP PUT方法进行rest api调用

Ios 如何在swift中使用HTTP PUT方法进行rest api调用,ios,swift,restkit,put,Ios,Swift,Restkit,Put,我用PUT方法尝试了下面的restapi 这是我的密码 let url = NSURL(string: "http://sampleurl") let request = NSMutableURLRequest(URL: url!) request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") request.HTTPMethod = "PUT" let session

我用
PUT
方法尝试了下面的
restapi

这是我的密码

let url = NSURL(string: "http://sampleurl")

let request = NSMutableURLRequest(URL: url!)

request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 

request.HTTPMethod = "PUT"

let session = NSURLSession(configuration:NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: nil, delegateQueue: nil)

let params:[String: AnyObject] = ["deviceId" : "device_1","mobileDeviceId" : "abcd","deviceType":"ios"]

request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: NSJSONWritingOptions(), error: nil)

let dataTask = session.dataTaskWithRequest(request) { (data, response, error) -> Void in

        if error != nil {

            //handle error

             print("Parsed error: '\(error)'")
        }
        else {

            let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding)
            print("Parsed JSON: '\(jsonStr)'")
        } 
    }
dataTask.resume()

它不起作用。请帮助我找出错误所在。

如下定义put函数:

//
// Put request
//
static func put(path: String, accessToken: Bool, data: Dictionary<String, AnyObject>, finish: (accessTokenX:String, data: JSON) -> ()) {
    apiRequest("PUT", path: path, accessToken: accessToken, contentType: nil, data: data) { (accessTokenX:String, data: AnyObject) in
        dispatch_async(dispatch_get_main_queue(), {
            finish(accessTokenX:accessTokenX, data: JSON(data))
        })
    }
}
试试这个


这是一个工作代码,我将您的字典作为JSON格式的字符串发送到服务器,在服务器中,我解析请求并构建另一个JSON对象,该对象包含与请求相同的值,然后将它们发送回应用程序。在应用程序中,我解析响应并打印结果:

 let session = NSURLSession.sharedSession()
            let url = "http://localhost:8080/yourServerGoesHere/putMethodTest"
            let request = NSMutableURLRequest(URL: NSURL(string: url)!)
            request.HTTPMethod = "PUT"

            let params:[String: AnyObject] = ["deviceId" : "device_1","mobileDeviceId" : "abcd","deviceType":"ios"]
            do{
                request.HTTPBody = try NSJSONSerialization.dataWithJSONObject(params, options: NSJSONWritingOptions())
                let task = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
                    if let response = response {
                        let nsHTTPResponse = response as! NSHTTPURLResponse
                        let statusCode = nsHTTPResponse.statusCode
                        print ("status code = \(statusCode)")
                    }
                    if let error = error {
                        print ("\(error)")
                    }
                    if let data = data {
                        do{
                        let jsonData = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions())
                        let deviceId = jsonData["deviceId"] as! String
                        let mobileDeviceId = jsonData["mobileDeviceId"] as! String
                        let deviceType = jsonData["deviceType"] as! String
                        print (" deviceId= \(deviceId), mobileDeviceId= \(mobileDeviceId), deviceType= \(deviceType)")
                        }catch _ {
                            print ("the response is not well JSON formatted")
                        }
                    }
                })
                task.resume()
            }catch _ {
                print ("Oops something happened buddy")
            }
如果您想尝试,以下是Java web服务代码:

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@Path("/putMethodTest")
    @PUT
    @Consumes(MediaType.TEXT_PLAIN)
    public Response putMethodTest(String requestString) {
        JSONObject requestJSON = new JSONObject(requestString);
        String deviceId = requestJSON.getString("deviceId");
        String mobileDeviceId = requestJSON.getString("mobileDeviceId");
        String deviceType = requestJSON.getString("deviceType");
        JSONObject response = new JSONObject();
        response.put("deviceId", deviceId);
        response.put("mobileDeviceId", mobileDeviceId);
        response.put("deviceType", deviceType);
        return Response.ok().entity(response.toString()).build();
    }

定义“不工作”错误描述已解析错误:“错误域=NSURErrorDomain Code=-1005”网络连接已丢失。“用户信息=0x7a7a8cc0{NSErrorFailingURLStringKey=,kCFStreamErrorCodeKey=-4,NSErrorFailingUrKey=,NSLocalizedDescription=网络连接已丢失。,kCFStreamErrorDomainKey=4,NSUnderlyingError=0x7a6f4520“操作无法完成。(kCFErrorDomainCFNetwork错误-1005)。”}“发生此错误可能是打字错误,但在您的
let url=NSURL(字符串:”http://sampleurl“
您最后的
不正确
。请注意,为什么不使用POST而不是PUT?听起来你在向服务器发送一些值。我必须用put方法调用api。因此,请使用Http PUT发送Api调用method@IOS开发者我给出了它是如何工作的提示,所以否决票在这之前考虑一下,并尝试selfOP请求一个PUT,而不是一个POST
 let session = NSURLSession.sharedSession()
            let url = "http://localhost:8080/yourServerGoesHere/putMethodTest"
            let request = NSMutableURLRequest(URL: NSURL(string: url)!)
            request.HTTPMethod = "PUT"

            let params:[String: AnyObject] = ["deviceId" : "device_1","mobileDeviceId" : "abcd","deviceType":"ios"]
            do{
                request.HTTPBody = try NSJSONSerialization.dataWithJSONObject(params, options: NSJSONWritingOptions())
                let task = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
                    if let response = response {
                        let nsHTTPResponse = response as! NSHTTPURLResponse
                        let statusCode = nsHTTPResponse.statusCode
                        print ("status code = \(statusCode)")
                    }
                    if let error = error {
                        print ("\(error)")
                    }
                    if let data = data {
                        do{
                        let jsonData = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions())
                        let deviceId = jsonData["deviceId"] as! String
                        let mobileDeviceId = jsonData["mobileDeviceId"] as! String
                        let deviceType = jsonData["deviceType"] as! String
                        print (" deviceId= \(deviceId), mobileDeviceId= \(mobileDeviceId), deviceType= \(deviceType)")
                        }catch _ {
                            print ("the response is not well JSON formatted")
                        }
                    }
                })
                task.resume()
            }catch _ {
                print ("Oops something happened buddy")
            }
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@Path("/putMethodTest")
    @PUT
    @Consumes(MediaType.TEXT_PLAIN)
    public Response putMethodTest(String requestString) {
        JSONObject requestJSON = new JSONObject(requestString);
        String deviceId = requestJSON.getString("deviceId");
        String mobileDeviceId = requestJSON.getString("mobileDeviceId");
        String deviceType = requestJSON.getString("deviceType");
        JSONObject response = new JSONObject();
        response.put("deviceId", deviceId);
        response.put("mobileDeviceId", mobileDeviceId);
        response.put("deviceType", deviceType);
        return Response.ok().entity(response.toString()).build();
    }