programing

Larabel에서 HTTP Request 본문 콘텐츠를 가져오려면 어떻게 해야 하나요?

yoursource 2022. 9. 30. 09:49
반응형

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!'메세지.좋아! 하지만 내 데이터베이스에는 빈 행이 있어.별로야.아직 본문 내용은 표시되지 않고 머리글만 표시됩니다.


회답 기준

다음 질문에 대한 답을 찾고 있습니다.

  1. 내 요청의 본문을 얻을 수 없는 이유는 무엇입니까?
  2. 내 요청의 본문 내용을 얻으려면 어떻게 해야 합니까?

내부 컨트롤러 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

반응형