Larabel에서 HTTP Request 본문 콘텐츠를 가져오려면 어떻게 해야 하나요?
API를 만들고 있습니다.Laravel 5
테스트하고 있습니다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
어떤 메서드를 호출해야 할지 잘 모르겠습니다.컨트롤러 내부에서 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
는 다음과 같습니다.
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
사용하도록 컨트롤러를 업데이트했습니다.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이 작동하지 않았기 때문에 JSON을 사용하는 API의 REST 부분을 진행했습니다.테스트 중 하나는 다음과 같습니다.
public function testPostMessagesContent()
{
$response = $this->call('POST', 'messages', ['content' => 'content']);
$this->assertEquals('saved!', $response->getContent());
}
이 테스트는 합격입니다.컬을 사용하면 콜도 정상적으로 수신됩니다.
curl -X POST -d "content=my_new_content" "http://localhost:8000/messages"
이 값은 반환됩니다.'saved!'
훌륭하지만 스탠드아론 PHP 스크립트에서 (클라이언트를 시뮬레이트하기 위해) 컬을 사용하려고 하면 다음과 같이 반환됩니다.
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.
POST 필드를 추가하는 curl 명령어는 다음과 같습니다.
curl_setopt($ch, CURLOPT_POSTFIELDS, 'content=test');
POSTFILDS가 요청 본문에 추가되고 있는 것 같습니다.이 경우에도 같은 문제가 있습니다.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!'
메세지.좋아! 하지만 내 데이터베이스에는 빈 행이 있어.별로야.아직 본문 내용은 표시되지 않고 머리글만 표시됩니다.
회답 기준
다음 질문에 대한 답을 찾고 있습니다.
- 내 요청의 본문을 얻을 수 없는 이유는 무엇입니까?
- 내 요청의 본문 내용을 얻으려면 어떻게 해야 합니까?
내부 컨트롤러 inject Request 개체입니다.따라서 컨트롤러 메서드 'foo' 내의 request body에 액세스하려면 다음 절차를 수행합니다.
public function foo(Request $request){
$bodyContent = $request->getContent();
}
세 번째 인수로 데이터를 전달할 수 있습니다.call()
API에 따라서는 6번째 파라미터를 사용할 수도 있습니다.
문서에서:
$this->call($method, $uri, $parameters, $files, $server, $content);
요청에서 데이터를 원하지 않고 응답에서 데이터를 원하는 것 같습니다.그 둘은 다르다.또한 컨트롤러에 올바르게 응답을 구축해야 합니다.
편집 #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
있는 $request->getContent()
, , 을하세요.
$request->all()
예:
public function foo(Request $request){
$bodyContent = $request->all();
}
언급URL : https://stackoverflow.com/questions/28459172/how-do-i-get-http-request-body-content-in-laravel
'programing' 카테고리의 다른 글
__getattr__와 __getattribute__의 차이점 (0) | 2022.09.30 |
---|---|
Conda를 사용한 일괄 패키지 업데이트 (0) | 2022.09.30 |
Java 소스 파일의 일부를 Kotlin으로 변환하려면 어떻게 해야 합니까? (0) | 2022.09.30 |
NaN 값을 확인하려면 어떻게 해야 하나요? (0) | 2022.09.30 |
Java에서 인덱스에서 Enum 값을 가져오려면 어떻게 해야 합니까? (0) | 2022.09.30 |