簡體   English   中英

Laravel中的HTTP請求體內容怎么獲取?

[英]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?


更新 #1

在此期間,我能夠得到一些結果。 我當前的測試如下所示:

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()


更新 #2

我更新了我的 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 "~".

更新 #3

我根本無法獲得 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!' 信息。 太好了,但是。 在我的數據庫中,現在我有一個空白行。 不太好,它仍然沒有看到正文內容。 只是標題。


回答標准

我正在尋找這些問題的答案:

  1. 為什么我無法獲取請求的正文內容?
  2. 如何獲取請求的正文內容?

內部控制器注入請求對象。 因此,如果您想訪問控制器方法“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 響應的更多信息:

http://laravel.com/docs/5.0/responses

試試這個..

$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM