2017-01-29 32 views
1

我正在創建一個快速的應用程序,我需要POST數據到我自己的網絡服務器。
目前,我的swift代碼看起來像這樣。Alamofire不POSTing到PHP腳本

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); 
?> 

唯一的問題是,當我運行SWIFT代碼let helper = UploadHelper(username: iProgram),我得到下面從我的PHP腳本響應:

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



array(0) { 
} 
GET: 

爲什麼我的帖子和GET變量爲空?我知道GET是空的,因爲我只發送POST數據,但不應該顯示POST類似「username = iProgrammer」的東西?

Finaly,這裏是我從打嗝西裝捕獲的HTTP請求:

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 

編輯: 出於某種原因,當我使用下面的代碼,改變我的PHP腳本,以顯示「GET」變量,我可以看到它應該發送的數據。

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

這裏是我從打嗝套房截獲請求:

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

您可以嘗試使用<?php $ postdata = file_get_contents(「php:// input」)來讀取原始數據。 ?> –

+0

@PawelDubiel當我從那裏回覆數據時,我什麼也沒有印。 – iProgram

回答

1

首先,var_dump不返回任何東西,它的輸出結果,所以使用

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

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

GET /networkStorage/ HTTP/1.1表明你做的GET請求,不POST。另外你的編碼錯誤JSONEncoding.defaul。嘗試改變請求代碼一點:

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

如果這不起作用,請嘗試更改從http:/192.168.1.243/networkStorage網址http:/192.168.1.243/networkStorage/http:/192.168.1.243/networkStorage/index.php。 當您向/networkStorage發送請求時,它可能會解決此問題,它會向burberry套裝中捕獲的數據中顯示的/networkStorage/發送新請求。

0

爲什麼我的POST和GET變量是空的?我知道GET是空的,因爲我只發送POST數據,但不應該顯示POST類似「username = iProgrammer」的東西?

編號$_POST僅針對HTML表單類編碼填充,如application/x-www-form-urlencoded或multipart/form-data。它看起來像你發送的是JSON,在這種情況下,你需要閱讀php://input流來獲取數據。

+0

如果你看看我對爪子的評論,file_get_contents(「php:// input」)不起作用。它什麼都不打印。 – iProgram