PUT请求在Swift 3中不起作用

时间:2017-06-21 06:56:04

标签: ios swift nsurlrequest

我已经为" PUT"实现了这个代码。请求:

var request: NSMutableURLRequest
let url:URL = URL(string: NetworkCallSDK.sharedSingleton().urlString! as String)!
request = NSMutableURLRequest(url: (url as URL) as URL)
print("getRequestHeaderWithAllParams:\(url)")
let parameter = ["key":"STRING"] as NSDictionary

    let body = NSMutableData()
    let boundary = "Boundary-\(UUID().uuidString)"

    //define the multipart request type

    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
    for (key, value) in parameter
    {
        body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
        body.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".data(using: String.Encoding.utf8)!)
        body.append("\(value)\r\n".data(using: String.Encoding.utf8)!)
    }
    body.append("--\(boundary)--\r\n".data(using: String.Encoding.utf8)!)

    request.httpMethod = "PUT"
    request.httpBody = body as Data
    request.timeoutInterval = 120
    return request

我从服务器获得500状态。同样的API在Android中运行。但是POST方法的相同代码对我来说很好。

1 个答案:

答案 0 :(得分:0)

服务器因内部服务器错误而失败,这通常表示崩溃或格式错误的POST数据。你有两个问题:

  • 您缺少每个请求部分的Content-Type字段,这是必需的。您可能应该添加以下内容:

    Content-Type: application/octet-stream
    

    这可能是造成500错误的原因。

  • 您的数据blob几乎肯定会显示(NULL)或空字符串,除非您在此代码之外使用base64(或类似代码)对其进行预编码。

然后发送原始数据。否则,您的服务器无法获取数据。为此,您需要执行以下操作:

  • 为您的身体使用NSData对象而不是NSString对象。
  • 您附加一个字符串,使用dataUsingEncoding:方法将其转换为NSData对象。
  • 对于您的身体数据,请附加实际的NSData对象,而不是将其转换为字符串。
  • 附加' \ r \ n'然后独立分离。

如果您的服务器要求数据为base64编码,请先通过调用base64EncodedDataWithOptions:将NSData转换为字符串。无论哪种方式,您仍然应该将主体构造为NSData对象。