2017-06-19 98 views
1

背景拉從http請求base64編碼字符串在PHP

我寫了一個小測試,以確保我可以從從我的移動應用做了一個POST請求提取數據。它工作正常,

$rawJsonObj = file_get_contents('php://input'); 
$json = json_decode($rawJsonObj, true); 
$decodedData = base64_decode($json['data']); 
file_put_contents('student-data/'.$json['username'].'.txt', $decodedData); 

然後在我的Slim Framework程序,我嘗試同樣的邏輯,我用它來創建爲空文件的實際數據。但是我仍然可以訪問請求中發送的用戶名和密碼。

$app->post('/api/v1/endpoint', function ($request, $response, $args) { 
    $rawJsonObj = $request->getParams(); 
    $json = json_decode($rawJsonObj, true); 
    $decodedData = base64_decode($json['data']); 
    file_put_contents('test.txt', $decodedData); 
return $response; 
} 

用戶名和密碼顯示在請求中,我可以在向文件請求中寫入數據時看到它們。

$data = $request->getParams(); 
file_put_contents('2.txt', $data); 

數據被寫爲文件,

","username":"myuname","password":"myPword"} 

但base64encoded串丟失,

在斯威夫特我創造這樣的字典,然後將其作爲json發佈,

let dict: [String: Any] = [ 
    "username": named, 
    "password": password, 
    "data": data.base64EncodedString() 
] 

if let json = try? JSONSerialization.data(withJSONObject: dict, options: []) { 
    request.httpBody = json 
} 

問題

如何請求主體訪問實際"data": data.base64EncodedString()Slim Framework 3

我認爲這與$rawJsonObj = file_get_contents('php://input');實際處理數據相比Slim的方式有關嗎?

+0

我不知道答案,但第一個片段顯示JSON不是任何類型的參數。這是請求主體。 –

+0

你是說在測試中?但是我發佈JSON,所以它不會是請求體中的JSON? – wuno

+0

沒關係。我只看了一下'getParams()'的實現,它應該真的返回兩者。你是否發送了一個Content-Type頭來告訴它實際上是JSON? –

回答

1

Request::getParams()是由Slim(不是PSR-7的一部分)收集所有輸入數據的自定義方法;換句話說,它大致相當於PHP的超全球性的$_REQUEST。在內部,它通過Request::getParsedBody()(這是PSR-7的一部分)抓取請求主體。在此處,與$_REQUEST$_POST主要出現分歧:

如果請求Content-Type或者是 application/x-www-form-urlencodedmultipart/form-data和 請求的方法是POST,這種方法必須返回 $_POST內容。

否則,此方法可能會返回任何反序列化請求主體內容的結果;如解析返回結構化內容, 潛在類型必須只是數組或對象。 A null值 指示身體內容的不存在。

雖然$_POST僅解碼標準格式編碼(因此你需要獲取和手動解析數據測試代碼)getParsedBody()嘗試解碼其他編碼,但是,就像$_POST,它需要一個適當的Content-Type這樣做。如果你從你的移動應用發送一個:

Content-Type: application/json 

...它會按預期工作,因爲Slim有一個內置的JSON解碼器。

如果你不能發送編碼聲明,你需要手動解碼的東西。在這種情況下,獲取原始請求主體的PSR-7方式爲Message::getBody(),返回(更具體地說,實現StreamInterfaceStream對象)。