php 如何在 Laravel 中获取 HTTP 请求正文内容?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/28459172/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How do I get HTTP Request body content in Laravel?
提问by beznez
I am making an API with Laravel 5
and I'm testing it with PHPUnit
. I need to test legacy functionality for compatibility, which is an XML POST. As of right now, my first test looks like:
我正在制作一个 API,Laravel 5
我正在使用PHPUnit
. 我需要测试遗留功能的兼容性,这是一个 XML POST。截至目前,我的第一个测试看起来像:
public function testPostMessages()
{
$response = $this->call('POST', 'xml');
$this->assertEquals(200, $response->getStatusCode());
}
This is passing just fine. Next on my list is actually sending the XML data with the POST. So for my second test, I have:
这通过就好了。我的列表中的下一个实际上是使用 POST 发送 XML 数据。所以对于我的第二次测试,我有:
public function testPostMessagesContent()
{
$response = $this->call('POST', 'xml');
$this->assertTrue(is_valid_xml($response->getContent()));
}
This test fails. However, I am not sending my XML data. How do I send my XML?
Now, after that I need to add in the functionality to get the content from the request. I know there is a Request
object that I can interact with but I don't exactly know which method to call on it. How do I get my XML from inside my controller?
此测试失败。但是,我没有发送我的 XML 数据。如何发送我的 XML?
现在,之后我需要添加功能以从请求中获取内容。我知道有一个Request
可以与之交互的对象,但我不完全知道要调用它的方法。如何从控制器内部获取 XML?
Update #1
更新 #1
I was able to get some results in the meantime. My current test looks like this:
在此期间,我得到了一些结果。我目前的测试是这样的:
public function testPostMessagesContent()
{
$response = $this->call('POST', 'xml', array('key' => 'value'), array(), array(), array('content' => 'content'));
$this->assertContains('~', $response->getContent());
}
I only have the tilde there because I know it won't match so that I can see the whole response. In XmlController.php
I have:
我只有波浪号,因为我知道它不会匹配,所以我可以看到整个响应。在XmlController.php
我有:
class XmlController extends Controller {
public function index(Request $request)
{
return $request;
}
}
My output from PHPUnit
is as follows:
我的输出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 "~".
Where are my parameters and my content? I feel like I am simply just using call()
incorrectly.
我的参数和内容在哪里?我觉得我只是使用call()
不正确。
Update #2
更新 #2
I updated my controller to use Request:all()
like so:
我更新了我的控制器,Request:all()
像这样使用:
class XmlController extends Controller
{
public function index()
{
$content = Request::all();
return $content;
}
}
This returned my key-value pair, but not the content.
这返回了我的键值对,但没有返回内容。
1) XmlTest::testPostMessagesContent
Failed asserting that '{"key":"value"}' contains "~".
Key-value pairs are good; it's progress. However, what I really need is the content since I'll be receiving that data in the content portion of the request. If I use Request::getContent()
I get back a blank string. Here's my call in the test:
键值对很好;这是进步。但是,我真正需要的是内容,因为我将在请求的内容部分接收该数据。如果我使用,Request::getContent()
我会返回一个空白字符串。这是我在测试中的调用:
$response = $this->call('POST', 'xml', array('key' => 'value'), array(), array(), array('content' => 'content'));
Here's my test results:
这是我的测试结果:
1) XmlTest::testPostMessagesContent
Failed asserting that '' contains "~".
Update #3
更新 #3
I am not able to get the content body of an HTTP Request at all. Since XML wasn't working, I moved forward with the REST part of my API, which uses JSON. Here's one of my tests:
我根本无法获得 HTTP 请求的内容正文。由于 XML 不起作用,我继续使用我的 API 的 REST 部分,它使用 JSON。这是我的测试之一:
public function testPostMessagesContent()
{
$response = $this->call('POST', 'messages', ['content' => 'content']);
$this->assertEquals('saved!', $response->getContent());
}
This test passes. If I use curl, I get a successful call as well:
此测试通过。如果我使用 curl,我也会成功调用:
curl -X POST -d "content=my_new_content" "http://localhost:8000/messages"
This returns 'saved!'
That's awesome, but if I try to use curl in a standalone PHP script (to simulate a client), this is what is returned:
这将返回'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.
This is my curl command adding the POST fields:
这是我添加 POST 字段的 curl 命令:
curl_setopt($ch, CURLOPT_POSTFIELDS, 'content=test');
It seems to me that POSTFIELDS is getting added to the body of the request. In this case, I still have the same problem. I am not able to get body content of my HTTP headers. After commenting out my validation, I get:
在我看来,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!
So I have my 'saved!'
message. Great! But, in my database now I have a blank row. Not great. It is still not seeing the body content, just the headers.
所以我有我的'saved!'
消息。伟大的!但是,在我的数据库中,我现在有一个空行。不是很好。它仍然看不到正文内容,只看到标题。
Answer Criteria
回答标准
I'm looking for the answers to these questions:
我正在寻找这些问题的答案:
- Why can't I get the body content of my request?
- How do I get the body content of my request?
- 为什么我无法获取请求的正文内容?
- 如何获取请求的正文内容?
回答by gandra404
Inside controller inject Request object. So if you want to access request body inside controller method 'foo' do the following:
内部控制器注入请求对象。因此,如果您想访问控制器方法“foo”中的请求主体,请执行以下操作:
public function foo(Request $request){
$bodyContent = $request->getContent();
}
回答by Jason McCreary
回答by delatbabel
I don't think you want the data from your Request, I think you want the data from your Response. The two are different. Also you should build your response correctly in your controller.
我认为您不想要Request 中的数据,我想您想要Response 中的数据。两者是不同的。此外,您应该在控制器中正确构建响应。
Looking at the class in edit #2, I would make it look like this:
查看编辑 #2 中的类,我会使它看起来像这样:
class XmlController extends Controller
{
public function index()
{
$content = Request::all();
return Response::json($content);
}
}
Once you've gotten that far you should check the content of your response in your test case (use print_r if necessary), you should see the data inside.
一旦你做到了这一点,你应该检查你的测试用例中响应的内容(必要时使用 print_r),你应该看到里面的数据。
More information on Laravel responses here:
有关 Laravel 响应的更多信息:
回答by user3785966
For those who are still getting blank response with $request->getContent()
, you can use:
对于那些仍然收到空白响应的人$request->getContent()
,您可以使用:
$request->all()
$request->all()
e.g:
例如:
public function foo(Request $request){
$bodyContent = $request->all();
}