[英]How do I get HTTP Request body content in Laravel?
我正在用Laravel 5
制作一個 API 並用PHPUnit
測試它。 我需要測試遺留功能的兼容性,這是一個 XML POST。 截至目前,我的第一個測試如下所示:
public function testPostMessages()
{
$response = $this->call('POST', 'xml');
$this->assertEquals(200, $response->getStatusCode());
}
這很好。 我列表中的下一個實際上是使用 POST 發送 XML 數據。 所以對於我的第二次測試,我有:
public function testPostMessagesContent()
{
$response = $this->call('POST', 'xml');
$this->assertTrue(is_valid_xml($response->getContent()));
}
這個測試失敗了。 但是,我沒有發送我的 XML 數據。 如何發送我的 XML?
現在,之后我需要添加從請求中獲取內容的功能。 我知道有一個Request
object 我可以與之交互,但我不知道要調用哪個方法。 如何從我的 controller 中獲取我的 XML?
在此期間,我能夠得到一些結果。 我當前的測試如下所示:
public function testPostMessagesContent()
{
$response = $this->call('POST', 'xml', array('key' => 'value'), array(), array(), array('content' => 'content'));
$this->assertContains('~', $response->getContent());
}
我只有波浪號在那里,因為我知道它不會匹配,所以我可以看到整個響應。 在XmlController.php
我有:
class XmlController extends Controller {
public function index(Request $request)
{
return $request;
}
}
我的PHPUnit的PHPUnit
如下:
1) XmlTest::testPostMessagesContent
Failed asserting that 'POST xml HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Accept-Language: en-us,en;q=0.5
Content-Type: application/x-www-form-urlencoded
Host: localhost
User-Agent: Symfony/2.X
' contains "~".
我的參數和內容在哪里? 我覺得我只是錯誤地使用了call()
。
我更新了我的 controller 以使用Request:all()
,如下所示:
class XmlController extends Controller
{
public function index()
{
$content = Request::all();
return $content;
}
}
這返回了我的鍵值對,但沒有返回內容。
1) XmlTest::testPostMessagesContent
Failed asserting that '{"key":"value"}' contains "~".
鍵值對很好; 這是進步。 但是,我真正需要的是內容,因為我將在請求的內容部分接收到該數據。 如果我使用Request::getContent()
我會得到一個空字符串。 這是我在測試中的電話:
$response = $this->call('POST', 'xml', array('key' => 'value'), array(), array(), array('content' => 'content'));
這是我的測試結果:
1) XmlTest::testPostMessagesContent
Failed asserting that '' contains "~".
我根本無法獲得 HTTP 請求的內容主體。 由於 XML 不工作,我繼續使用 API 的 REST 部分,它使用 JSON。這是我的測試之一:
public function testPostMessagesContent()
{
$response = $this->call('POST', 'messages', ['content' => 'content']);
$this->assertEquals('saved!', $response->getContent());
}
這個測試通過。 如果我使用 curl,我也會成功調用:
curl -X POST -d "content=my_new_content" "http://localhost:8000/messages"
這將返回'saved!'
太棒了,但是如果我嘗試在獨立的 PHP 腳本(模擬客戶端)中使用 curl,返回的是:
Array ( [url] => http://localhost:8000/messages [content_type] => text/html; charset=UTF-8 [http_code] => 302 [header_size] => 603 [request_size] => 118 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 0.063977 [namelookup_time] => 0.000738 [connect_time] => 0.000866 [pretransfer_time] => 0.000943 [size_upload] => 12 [size_download] => 328 [speed_download] => 5126 [speed_upload] => 187 [download_content_length] => -1 [upload_content_length] => 12 [starttransfer_time] => 0.057606 [redirect_time] => 0 [certinfo] => Array ( ) [primary_ip] => ::1 [primary_port] => 8000 [local_ip] => ::1 [local_port] => 63248 [redirect_url] => http://localhost:8000 [request_header] => POST /messages HTTP/1.1 Host: localhost:8000 Accept: */* Content-type: text/xml Content-length: 12 ) Redirecting to http://localhost:8000.
這是我的 curl 添加 POST 字段的命令:
curl_setopt($ch, CURLOPT_POSTFIELDS, 'content=test');
在我看來,POSTFIELDS 已添加到請求正文中。 在這種情況下,我仍然有同樣的問題。 我無法獲取 HTTP 標頭的正文內容。 評論我的驗證后,我得到:
Array ( [url] => http://localhost:8000/messages [content_type] => text/html; charset=UTF-8 [http_code] => 200 [header_size] => 565 [request_size] => 118 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 0.070225 [namelookup_time] => 0.000867 [connect_time] => 0.00099 [pretransfer_time] => 0.001141 [size_upload] => 12 [size_download] => 6 [speed_download] => 85 [speed_upload] => 170 [download_content_length] => -1 [upload_content_length] => 12 [starttransfer_time] => 0.065204 [redirect_time] => 0 [certinfo] => Array ( ) [primary_ip] => ::1 [primary_port] => 8000 [local_ip] => ::1 [local_port] => 63257 [redirect_url] => [request_header] => POST /messages HTTP/1.1 Host: localhost:8000 Accept: */* Content-type: text/xml Content-length: 12 ) saved!
所以我有我'saved!'
信息。 太好了,但是。 在我的數據庫中,現在我有一個空白行。 不太好,它仍然沒有看到正文內容。 只是標題。
我正在尋找這些問題的答案:
內部控制器注入請求對象。 因此,如果您想訪問控制器方法“foo”中的請求主體,請執行以下操作:
public function foo(Request $request){
$bodyContent = $request->getContent();
}
您可以將數據作為第三個參數傳遞給call()
。 或者,根據您的 API,您可能想要使用第六個參數。
從 文檔:
$this->call($method, $uri, $parameters, $files, $server, $content);
對於那些仍然使用$request->getContent()
獲得空白響應的人,您可以使用:
$request->all()
例如:
public function foo(Request $request){
$bodyContent = $request->all();
}
我認為您不想要Request 中的數據,我想您想要Response 中的數據。 兩者是不同的。 此外,您應該在控制器中正確構建響應。
查看編輯 #2 中的類,我會使它看起來像這樣:
class XmlController extends Controller
{
public function index()
{
$content = Request::all();
return Response::json($content);
}
}
一旦你做到了這一點,你應該檢查你的測試用例中響應的內容(必要時使用 print_r),你應該看到里面的數據。
有關 Laravel 響應的更多信息:
試試這個..
$userinput = request()->getContent();
$toArray = explode('&', $userinput);
foreach ($toArray as $toArr) {
$arr1[] = explode('=', $toArr);
$arr2 = [];
foreach ($arr1 as $a1 ) {
$arr2[$a1[0]] = $a1[1];
}
};
return $arr2;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.