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方法,相同的代码对我来说工作正常。
答
服务器发生内部服务器错误,通常表示崩溃或格式错误的POST数据。这里有两个问题:
-
您缺少每个请求部分的Content-Type字段,这是必需的。您应该添加如下内容:
Content-Type: application/octet-stream
这可能是500错误的原因。
除非在此代码之外使用base64(或类似)对其进行预编码,否则您的数据blob几乎肯定会显示为空(NULL)或空字符串。
然后发送原始数据。否则,您的服务器将无法获取数据。为此,您需要执行以下操作:
- 使用NSData对象而不是NSString对象作为您的主体。
- 无处不在你附加一个字符串,使用
dataUsingEncoding:
方法将其转换为NSData对象。 - 对于您的身体数据,附加实际的NSData对象而不是将其转换为字符串。
- 之后独立追加'\ r \ n'和分隔符。
如果您的服务器要求数据为base64编码,请首先调用base64EncodedDataWithOptions:
将NSData转换为字符串。无论哪种方式,你仍然应该构造一个NSData对象的主体。
'500状态来自服务器'。这是内部严重错误 –
不相关,但URL(URL作为URL)是很搞笑的。 – vadian
实际上,错误500表示您的服务器有内部错误,所以我建议您尝试重新检查您的后端Web服务。后端代码中可能存在崩溃或致命错误。 –