PUT请求未按斯威夫特3

问题描述:

工作我已经实现了“PUT”请求验证码:PUT请求未按斯威夫特3

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方法,相同的代码对我来说工作正常。

+0

'500状态来自服务器'。这是内部严重错误 –

+2

不相关,但URL(URL作为URL)是很搞笑的。 – vadian

+0

实际上,错误500表示您的服务器有内部错误,所以我建议您尝试重新检查您的后端Web服务。后端代码中可能存在崩溃或致命错误。 –

服务器发生内部服务器错误,通常表示崩溃或格式错误的POST数据。这里有两个问题:

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

    Content-Type: application/octet-stream 
    

    这可能是500错误的原因。

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

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

  • 使用NSData对象而不是NSString对象作为您的主体。
  • 无处不在你附加一个字符串,使用dataUsingEncoding:方法将其转换为NSData对象。
  • 对于您的身体数据,附加实际的NSData对象而不是将其转换为字符串。
  • 之后独立追加'\ r \ n'和分隔符。

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