2017-09-01 1 views
0

J'essaie de recréer les paramètres de ce Postman pour poster dans Alamofire. C'est la première fois que je vois une API qui nécessite à la fois des paramètres et un corps avec Raw Json. J'en ai fini avec la collecte et le formatage de mes données (soit en utilisant Json SwiftyJSON ou le dictionnaire [String : Any]/Parameters) pour cette exigence.Postman Body Raw Demande à Swift Alamofire

enter image description here

Pendant que je l'ai vu une question semblable à ceci: Postman request to Alamofire request mais il n'a pas une réponse valable. Supposons que je suis assez expérimenté avec les données de publication/obtention/etc de diverses API mais je ne sais pas comment transmettre des données brutes comme dans la photo ci-dessus. S'il vous plaît consulter mes commentaires aussi dans le code.

Voici ce que je fais avec ma fonction de cette demande:

/** Apply to job with Shift. 
* This service function creates a json data for applying. 
*/ 

func someFuncService(_ job: Job, daySchedules: [(Int, String, Schedule)], withBlock completion: @escaping JobServiceCommonCallBack) { 
    AuthService.someFunc { (currentCustomer, accessToken) in 
     guard let lalala = currentCustomer?.id, 
      let accessT = accessToken else { 
       completion(LalaErrors.currentCustomerError) 
       return 
     } 

     guard let jobId = job.id else { 
      completion(LalaErrors.modelError) 
      return 
     } 


     let coreService = LalaCoreService() 

     let applicantEndpoint = LalaCoreService.Endpoint.Applicant 

     let parameters = [ 
      "param1" : customerId, 
      "param2" : jobId, 
      "accessToken" : accessToken, 
      "shift" : self.generateDataFromDaySchedules(daySchedules) // this returns [String : Any], can be printed into Json using JSON(x) 
      ] as Parameters 

     GPLog(classSender: self, log: "FINAL PARAMETER: \(parameters)") 

     coreService.request = Alamofire.request(
      applicantEndpoint, 
      method: .post, 
      parameters: parameters, 
      encoding: URLEncoding.default, // I already have tried .httpbody too. 
      headers: nil 
     ) 

     coreService.request { 
      (response, result) in 

      if let error = result?.error { 
       if response!.statusCode == 500 { 
        completion(GPKitError.newError(description: "Failed to apply. Please contact the admin.")) 
        return 
       } 

       completion(error) 
       return 
      } 

      // Success 
      completion(nil) 
      return 
     } 
    } 
} 

EDIT: La question est donc, ce que je fais mal ici? L'API me renvoie le code d'état 500 erreur interne du serveur.

+0

Quel est l'en-tête unique vous configurez dans Postman? Vous définissez les en-têtes sur «nil» dans votre requête Alamofire. –

+0

En-tête dans mon postier est 'Content-Type'' application/x-www-form-urlencoded' qui n'a pas d'importance. Essayé de supprimer cela dans Postman et la demande fonctionne. Toutes mes demandes ne nécessite aucun en-tête. – Glenn

+1

Je voudrais encore essayer dans Alamofire si l'utilisation de cette en-tête résout le problème. Définissez 'encoding' sur' URLEncoding.httpBody' et utilisez l'en-tête spécifié. Btw est 'Parameters' juste un typealias pour' [String: Any] '? –

Répondre

1
coreService.request = Alamofire.request(
     applicantEndpoint, 
     method: .post, 
     parameters: parameters, 
     encoding: URLEncoding.default, // I already have tried .httpbody too. 
     headers: nil 
    ) 

devrait être

coreService.request = Alamofire.request(
      applicantEndpoint + accessToken, 
      method: .post, 
      parameters: parameters, 
      encoding: JSONEncoding.default, 
      headers: nil 
     ) 
+0

Silly moi, j'ai utilisé ce JSONEncoding.default dans toutes mes demandes et je n'ai même pas essayé d'utiliser cela dans cette demande particulière parce que je pensais que cela ne fonctionnera même pas. Merci! – Glenn