2017-01-29 5 views
1

Ich erstelle eine schnelle Anwendung, wo ich Daten auf meinem eigenen Webserver POST müssen.
Im Moment sieht mein schneller Code so aus.Alamofire nicht POST zu PHP-Skript

fileprivate class AlamofireHelper { 
    static var Manager : Alamofire.SessionManager = { 
     // Create the server trust policies 
     let serverTrustPolicies: [String: ServerTrustPolicy] = [ 
      "192.168.1.243": .disableEvaluation 
     ] 
     // Create custom manager 
     let configuration = URLSessionConfiguration.default 
     configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders 
     let man = Alamofire.SessionManager(
      configuration: URLSessionConfiguration.default, 
      serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies) 
     ) 
     return man 
    }() 

} 
class UploadHelper 
{ 

    private var _postData = [String:Any]() 
    private let almoHelper = AlamofireHelper.Manager 
    init(username:String) { 
     _postData["username"] = username 
     print("Setup") 
     submitRequest() 
    } 

    func submitRequest() 
    { 
     print("Data is: \(_postData)") 
     almoHelper.request("http:/192.168.1.243/networkStorage", method: .post, parameters: _postData, encoding: JSONEncoding.default).responseString { (responce) in 
      print("Responce: \(responce)") 
     } 
    } 
} 

PHP:

<?php 
    echo "POST: " . var_dump($_POST) . "\n\n\n\n"; 
    echo "GET: " . var_dump($_GET); 
?> 

Das einzige Problem ist, wenn ich den SWIFT-Code let helper = UploadHelper(username: iProgram) laufen lasse, erhalte ich die folgende Antwort von meinem PHP-Skript:

Data: ["username": "iProgram"] 
Responce: SUCCESS: array(0) { 
} 
POST: 



array(0) { 
} 
GET: 

Warum POST sind und GET Variablen leer? Ich verstehe, dass das GET leer ist, weil ich nur POST-Daten sende, aber sollte der POST nicht etwas wie "username = iProgrammer" zeigen?

Finaly, hier ist die HTTP-Anforderung I von rülpsen Anzug gefangen:

GET /networkStorage/ HTTP/1.1 
Host: 192.168.1.243 
Accept: */* 
User-Agent: Network%20Storage/1 CFNetwork/808.2.16 Darwin/16.3.0 
Accept-Language: en-gb 
Accept-Encoding: gzip, deflate 
Connection: close 

Edit: Aus irgendeinem Grund, wenn ich den Code unten verwenden und mein PHP-Skript ändern die 'GET' zeigen Variable, ich kann die Daten sehen, die es senden sollte.

almoHelper.request("http://192.168.1.243/networkStorage", method: .get, parameters: _postData).responseString { (myResponce) in 
      let result = myResponce.result 
      print("Result is: \(result.value!)") 
     } 

Und hier ist die Bitte, die ich von rülpsen suite abgefangen:

GET /networkStorage/?username=iProgram HTTP/1.1 
Host: 192.168.1.243 
Accept: */* 
User-Agent: Network%20Storage/1 CFNetwork/808.2.16 Darwin/16.3.0 
Accept-Language: en-gb 
Accept-Encoding: gzip, deflate 
Connection: close 
+0

Können Sie versuchen, rohe Postdaten mit

+0

@PawelDubiel, wenn ich die Daten von dort abhöre, bekomme ich nichts gedruckt. – iProgram

Antwort

1

Zunächst einmal ist var_dump nichts zurück, es tut Ausgabeergebnis, verwenden so

echo "POST: "; var_dump($_POST); echo "\n\n\n\n"; 

oder

echo "POST: " . print_r($_POST, true) . "\n\n\n\n"; 

GET /networkStorage/ HTTP/1.1 zeigt, dass Sie GET-Anfrage machen, nicht veröffentlichen. Außerdem haben Sie eine falsche Codierung JSONEncoding.defaul. Versuchen Sie, Anforderungs-Code ein wenig zu ändern:

almoHelper.request("http:/192.168.1.243/networkStorage", method: .post, parameters: _postData, encoding: URLEncoding.httpBody).responseString { (responce) in 
    print("Responce: \(responce)") 
} 

Wenn dies nicht funktioniert, versuchen Sie die URL http:/192.168.1.243/networkStorage-http:/192.168.1.243/networkStorage/ oder http:/192.168.1.243/networkStorage/index.php ändern. Dies könnte das Problem beheben, wenn Sie eine Anfrage an /networkStorage senden, es sendet eine neue Anfrage an /networkStorage/ wie in den erfassten Daten von Burpsuit gezeigt.

0

Warum meine POST sind und leer GET-Variablen? Ich verstehe, dass das GET leer ist, weil ich nur POST-Daten sende, aber sollte der POST nicht etwas wie "username = iProgrammer" zeigen?

No. $_POST ist nur für die HTML-Form-artige Codiersystem bevölkert, wie application/x-www-form-urlencoded oder mehrteiliger/Form-Daten. Es sieht so aus, als ob Sie JSON senden würden. In diesem Fall müssen Sie den Stream php://input lesen, um zu den Daten zu gelangen.

+0

Wenn Sie meinen Kommentar zur Sperrung betrachten, funktioniert file_get_contents ("php: // input") nicht. Es druckt nichts. – iProgram

Verwandte Themen