2014-09-04 2 views
0

PHP에서 JSON을 반환하는 원격 HTTPS 주소로 POST 요청을 보내야합니다. file_get_contents()가 4xx에서 HTML을 반환 할 수 있습니까?

//$url = ... 
    $data = array('username' => $username, 'password' => $passwort); 

    $options = array(
     'http' => array(
      'header' => "Content-type: application/x-www-form-urlencoded\r\n", 
      'method' => 'POST', 
      'content' => http_build_query($data), 
     ), 
    ); 
    $context = stream_context_create($options); 

    $result = file_get_contents($url, false, $context); 

그러나 마지막 줄에서 함수가 failed to open stream: HTTP request failed! HTTP/1.1 403 FORBIDDEN 오류와 함께 실패 :

나는 다음과 같은 코드를 사용했습니다.

서버는 HTML 형식으로 설명을 보내지 만, file_get_contents을 통해 액세스하는 방법을 알지 못합니다. 도움?

편집 : 대신 cURL을 사용합니다.

+3

더 많은 상황을 제어해야하는 경우 ['cURL'] (http://php.net/curl)이 더 좋은 해결책 일 수 있습니까? – BlitZ

+0

그냥, 빠른 질문,'$ 데이터'부분'$ passwort'에 변수의 이름을 지정했는지 또는'$ password'라고 이름이 붙어 있습니까? – Jhecht

+0

@Jhecht가 중요합니까? 그렇다면 file_get_contents 함수를 사용할 때 대답은 "불가능합니다"라고 생각하십니까? – Howie

답변

2

내가 아는 한 불가능합니다. 그러나 Guzzle와 같은 HTTP 클라이언트를 사용하면이 요청을 매우 쉽게 처리하고 오류를 정상적으로 처리 할 수 ​​있습니다. 또한 Guzzle은 후드 아래에서 cURL을 사용하므로 직접 처리 할 필요가 없습니다!

이처럼 POST 요청을 보내기 :

$client = new GuzzleHttp\Client(); 
$response = $client->post($url, [ 
    'body' => [ 
     'username' => $username, 
     'password' => $password 
    ] 
]); 

echo $response->getStatusCode();   // 200 
echo $response->getHeader('content-type'); // 'application/json; charset=utf8' 
echo $response->getBody();     // {"type":"User"...' 
var_export($response->json());    // Outputs the JSON decoded data 

당신이 자동으로 URL 인코딩됩니다 몸 배열에 사용자 이름과 암호를 배치하고 있기 때문에!

당신은 응답이 존재하는 경우 4XX 응답의 몸을 객체 지향 방법으로 오류를 처리하고 얻을 수있을 것입니다 :

try { 
    $client->get('https://github.com/_abc_123_404'); 
} catch (RequestException $e) { 
    echo $e->getRequest(); 
    if ($e->hasResponse()) { 
     echo $e->getResponse(); 
    } 
} 

자세한 내용은 documentation를 참조하십시오.