2017-06-21 74 views
0

工作我已經實現了「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服務。後端代碼中可能存在崩潰或致命錯誤。 –

回答

0

服務器發生內部服務器錯誤,通常表示崩潰或格式錯誤的POST數據。這裏有兩個問題:

  • 您缺少每個請求部分的Content-Type字段,這是必需的。您應該添加如下內容:

    Content-Type: application/octet-stream 
    

    這可能是500錯誤的原因。

  • 除非在此代碼之外使用base64(或類似)對其進行預編碼,否則您的數據blob幾乎肯定會顯示爲空(NULL)或空字符串。

然後發送原始數據。否則,您的服務器將無法獲取數據。爲此,您需要執行以下操作:

  • 使用NSData對象而不是NSString對象作爲您的主體。
  • 無處不在你附加一個字符串,使用dataUsingEncoding:方法將其轉換爲NSData對象。
  • 對於您的身體數據,附加實際的NSData對象而不是將其轉換爲字符串。
  • 之後獨立追加'\ r \ n'和分隔符。

如果您的服務器要求數據爲base64編碼,請首先調用base64EncodedDataWithOptions:將NSData轉換爲字符串。無論哪種方式,你仍然應該構造一個NSData對象的主體。