2017-09-14 1 views
0

Tout d'abord, nous utilisons le code ci-dessous pour que l'API ne fonctionne que sur les appareils mobiles et non sur les navigateurs. "Obtention d'une erreur 404 lorsque la requête est effectuée via Alamofire dans swift3

$iPod = stripos($_SERVER['HTTP_USER_AGENT'], "iPod"); 
    $iPhone = stripos($_SERVER['HTTP_USER_AGENT'], "iPhone"); 
    $iPad = stripos($_SERVER['HTTP_USER_AGENT'], "iPad"); 
    $Android = stripos($_SERVER['HTTP_USER_AGENT'], "Android"); 

$json_data = json_decode(file_get_contents('php://input')); 
if ($json_data) { 
    $username_1 = $json_data->username; 
    if ($Android || $iPad || $iPhone || $iPod) {} 

En second lieu, les APIs travaillent sur Android (reprise de volée en utilisant) et ios objective-c à l'aide AFNetworking. Mais, maintenant, je suis PORTAGE le projet swift3 et je suis en utilisant « Alamofire » pour les appels réseau .

Méthode :: (Voici comment je fais la demande POST).

let headers : HTTPHeaders = [ 
      "Accept" : "application/json" 
     ] 

Alamofire.request("API URL", method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers) 
      .responseJSON{ 
       response in 
       if let json = response.result.value{ 
       } 

Mais, je reçois une erreur 404, que nous obtenons habituellement lorsque nous avons atteint api dans le navigateur Après que j'ai enlevé que vérification backend et la demande a bien fonctionné et eu la bonne réponse. Mais, nous ne pouvons pas supprimer ce contrôle. Alors aidez-moi, si je fais des erreurs avec les en-têtes d'autre chose.

C'est ce que je reçois dans debugPrint (réponse) ::

{ status code: 200, headers { 
    "Access-Control-Allow-Origin" = "*"; 
    "Cache-Control" = "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"; 
    Connection = "Keep-Alive"; 
    "Content-Encoding" = gzip; 
    "Content-Length" = 84; 
    "Content-Type" = "text/html; charset=UTF-8"; 
    Date = "Thu, 14 Sep 2017 17:03:17 GMT"; 
    Expires = "Thu, 19 Nov 1981 08:52:00 GMT"; 
    "Keep-Alive" = "timeout=5"; 
    Pragma = "no-cache"; 
    Server = "Apache/2.4.25"; 
    Vary = "Accept-Encoding,User-Agent"; 
    "X-Powered-By" = "PHP/5.6.31"; 
} } 
[Data]: 80 bytes 
[Result]: SUCCESS: { 
    "is_valid" = 0; 
    status = 404; 
    "status_message" = "access denied"; 
    success = 0; 
} 
+0

Êtes-vous Assurez-vous que l'User-Agent contient un iPod, un iPhone ou un iPad? Lisez ce qu'il semble envoyer: https://github.com/Alamofire/Alamofire/blob/master/README.md#http-headers. En outre, en tant que débogage puisque vous semblez avoir le contrôle sur le serveur, vous pouvez vérifier l'agent utilisateur. – Larme

Répondre

0

Alomafire envoie un paramètre d'en-tête par défaut User-Agent bien, mais sa valeur est quelque chose comme ça iOS Example/1.0 (com.alamofire.iOS-Example; build:1; iOS 10.0.0) Alamofire/4.0.0.

Ceci est de leur readme: enter image description here

Vous pouvez fournir évidemment vos propres en-têtes personnalisés:

let headers: HTTPHeaders = [ 
    "User-Agent": "iPhone", 
    "Accept": "application/json" 
] 

Alamofire.request("<Ypur URL>", headers: headers) 
    .responseJSON { response in 
    debugPrint(response) 
} 

Ou si vous voulez garder les autres paramètres d'en-tête par défaut

var headers = Alamofire.SessionManager.defaultHTTPHeaders 
headers["User-Agent"] = "iPhone" 
+0

fait que toujours pas de chance .. –

+0

@karticchaudhary: Pouvez-vous utiliser charles et voir ce qui est envoyé lorsque vous faites un appel à partir de dire le code Android et votre code iOS? –

+0

@PuneetSharma Je n'ai pas vérifié Alamofire, mais s'il utilise le 'NSURLSessionConfiguration' de' NSURLSession', 'configuration' est" copie ". Et comme suggéré par Alamofire "Si vous avez besoin de personnaliser ces en-têtes, une URLSessionConfiguration personnalisée doit être créée, la propriété defaultHTTPHeaders doit être mise à jour et la configuration doit être appliquée à une nouvelle instance de SessionManager." CREATE un URLSessionConfiguration et définissez-le à l'URLSession. Aussi, si l'auteur a le contrôle sur le serveur, laissez le serveur chercher "iOS" au lieu de "iPhone", comme il l'a fait pour "Android". Le choix de la différence est bizarre. – Larme