2016-11-03 2 views
1

Le code ci-dessous est basé sur this excellent SO answer for making POST requests on iOS. Ce code tente de faire une requête POST à:iOS: la requête HTTP POST expire lors de la définition de la propriété httpBody

http://requestb.in/14090od1

La demande fonctionne s'il n'y a pas de valeur pour la propriété httpBody de l'objet URLRequest, ou si la valeur est que la chaîne vide.

Cependant, une fois qu'une valeur non vide est affectée à httpBody, la demande expire.

Quelqu'un sait pourquoi?

// Succeeds 
let userOptions = ["url": "http://requestb.in/14090od1"] 
userOptions["bodyString" : ""] 
doPost(userOptions: userOptions) 

// Fails 
let userOptions = ["url": "http://requestb.in/14090od1"] 
userOptions["bodyString" : "hi"] 
doPost(userOptions: userOptions) 


fileprivate func doPost(userOptions: [String:Any]) { 
    // Get URL string 
    let urlString = userOptions["url"] as? String ?? "" 

    // If invalid URL, return early 
    guard let url = URL(string: urlString) else { 
     printError("Error in doPost: malformed URL") 
     return 
    } 

    // If here, URL valid so execute request 
    // Create request 
    var request = URLRequest(url: url) 

    // Add headers 
    if let tHeaders = userOptions["headers"] as? [String:String] { 
     for (key, value) in tHeaders { 
      request.setValue(value, forHTTPHeaderField: key) 
     } 
    } 

    // Add body data 
    let bodyString = userOptions["bodyString"] as? String ?? "" 
    request.httpBody = bodyString.data(using: .utf8) 

    // Create data task 
    let task = URLSession.shared.dataTask(with: request) { data, response, error in 
     // If networking error, return early 
     guard let data = data, let httpResponse = response as? HTTPURLResponse, error == nil else { 
      printError("Error with network while executing POST request: \(error)") 
      return 
     } 

     // Why, oh why, does it not reach here??? 
    } 

    // Start data task 
    print("Executing HTTP request: \(request)") 
    task.resume() 
} 
+0

Outre le réglage de la 'httpMethod', il convient de noter que lorsque vous effectuez une requête, vous utilisez généralement l'un des paramètres acceptés' Content-type' JSON, XML, ou 'x-www-form-urlencoded '. À quoi s'attend votre service Web? Il est très, inhabituel de voir un corps de requête qui est tout simplement "Hi". Comment analysez-vous précisément le corps de la requête dans votre service Web? – Rob

+0

@Rob yup, compris que c'est inhabituel, mais l'objectif était de simplifier la question autant que possible. Merci pour votre aide sur cette question et pour avoir fourni la réponse à l'autre question! – Crashalot

Répondre

0

Si vous voulez faire une demande POST, non seulement voulez-vous régler le httpBody, mais vous voulez aussi régler la httpMethod de la demande de POST.

request.httpMethod = "POST" 
+0

Cela l'a résolu! Merci. – Crashalot

+0

Mais tout indice pourquoi il arrive à expiration lorsque la propriété 'httpBody' n'est pas vide? – Crashalot

+0

Je suppose qu'il provient de la création d'une requête qui a un 'httpBody' utilisant un' httpMethod' par défaut de 'GET', qui n'envoie jamais de' httpBody'. Je souhaite que cela soit géré plus gracieusement, cependant. – Rob