2017-01-11 13 views
4

Я пытаюсь использовать file_get_contents для «отправки» URL-адреса и получения токена аутентификации. Проблема, с которой я сталкиваюсь, заключается в том, что она возвращает ошибку.Разместить запрос с файлом_get_content не работает

Message: file_get_contents(something): failed to open stream: HTTP request failed! HTTP/1.1 411 Length Required.

Я не уверен, что является причиной этого, но нужна помощь. Вот функция.

public function ForToken(){ 
     $username = 'gettoken'; 
     $password = 'something'; 
     $url = 'https://something.com'; 
     $context = stream_context_create(array (
      'http' => array (
      'header' => 'Authorization: Basic ' . base64_encode("$username:$password"), 
      'method' => 'POST' 
      ) 
     )); 

     $token = file_get_contents($url, false, $context); 
     if(token){ 
      var_dump($token); 
     }else{ 
      return $resultArray['result'] = 'getting token failed'; 
     } 
    } 

Я попробовал его с POSTMAN, и она работает, вот только проблема, которую я имею, что почему разве он работает с file_get_contents.

+0

Нечто должно быть испорчено заголовком '$ context' и' Content-Length'. –

+0

@ patryk-uszynski Как добавить Content-Length? –

+0

'file_get_content' имеет некоторые ограничения. Попробуйте с CURL –

ответ

0

Я не могу комментировать из-за моей репутации;

В некоторых серверах file_get_content не доступно ...

Вы можете попробовать с CURL как this

+0

взял ваш совет, попробовал его с CURL, но все время возвращает false. –

+0

Можете ли вы разместить код CURL на главный пост для справок в будущем? – ahmetertem

+0

Создал контейнер для пасты, чтобы вы могли проверить http://pastebin.com/YdWd8hu3 –

0

Вашего запрос нету какие-либо данные и длина содержимого отсутствует.

Вы можете попробовать это:

public function ForToken(){ 
    $username = 'gettoken'; 
    $password = 'something'; 
    $url = 'https://something.com'; 

    $data = array('foo' => 'some data'); 
    $data = http_build_query($data); 

    $context_options = array (
    'http' => array (
     'method' => 'POST', 
     'header'=> "Content-type: application/x-www-form-urlencoded\r\n" 
      . "Authorization: Basic " . base64_encode("$username:$password") . "\r\n" 
      . "Content-Length: " . strlen($data) . "\r\n", 
     'content' => $data 
     ) 
    ); 

    $context = context_create_stream($context_options); 

    $token = file_get_contents($url, false, $context); 
    if(token){ 
     var_dump($token); 
    }else{ 
     return $resultArray['result'] = 'getting token failed'; 
    } 
} 

Вот аналогичная проблема:

How to fix 411 Length Required error with file_get_contents and the expedia XML API?

+0

Где идет имя пользователя и пароль? –

+0

@ Masnad Nihit такой же, как раньше. Вы должны конкатрировать их в строку заголовков и отделить их от '\ r \ n' –

+0

. Я пытаюсь выполнить ваш пример, но не смог, не могли бы вы обновить свой пример, но добавив мою информацию. –

0

RFC2616 10.4.12 http://tools.ietf.org/html/rfc2616#section-10.4.12

Код: (Не работает, смотрите ниже)

public function ForToken(){ 
$username = 'gettoken'; 
$password = 'something'; 
$url = 'https://something.com'; 
$context = stream_context_create(array (
'http' => array (
'header' => 'Authorization: Basic ' . base64_encode("$username:$password") . 'Content-Length: ' . strlen($url) . '\r\n', 
'method' => 'POST' 
) 
)); 
$token = file_get_contents($url, false, $context); 
if(token){ 
var_dump($token); 
}else{ 
return $resultArray['result'] = 'getting token failed'; 
} 
} 

второй Try:

public function ForToken(){ 
$username = 'gettoken'; 
$password = 'something'; 
$url = 'https://something.com'; 
$context_options = array (
'http' => array (
'method' => 'POST', 
'header'=> "Content-type: application/x-www-form-urlencoded\r\n" . "Authorization: Basic " . base64_encode("$username:$password") . "Content-Length: " . strlen($url) . "\r\n", 
'content' => $url 
) 
); 
$context = stream_context_create($context_options); 
$token = file_get_contents($url, false, $context); 
if(token){ 
var_dump($token); 
}else{ 
return $resultArray['result'] = 'getting token failed'; 
} 
} 

Это из ответа Patryk-uszynski отформатирован с кодом ФП в.

+0

Этот код не работает, к сожалению. –

+0

Действительно? (Я думал, что у меня это есть.) Я попробую еще раз. –

+0

Мои двойные кавычки Я думаю, что проблема –

2

Не могу командовать, поэтому я сделаю это таким образом. Если вы используете Postman, почему бы вам не позволить Postman генерировать код для вас. В почтальоне вы можете щелкнуть код по запросу, и вы даже можете выбрать, на каком языке кодирования вы его получите. Как PHP с cURL:

$curl = curl_init(); 

curl_setopt_array($curl, array(
    CURLOPT_URL => "http://somthing.com/", 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_ENCODING => "", 
    CURLOPT_MAXREDIRS => 10, 
    CURLOPT_TIMEOUT => 30, 
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, 
    CURLOPT_CUSTOMREQUEST => "POST", 
    CURLOPT_HTTPHEADER => array(
    "password: somthing", 
    "username: gettoken" 
), 
)); 

$response = curl_exec($curl); 
$err = curl_error($curl); 

curl_close($curl); 

if ($err) { 
    echo "cURL Error #:" . $err; 
} else { 
    echo $response; 
} 

Надеюсь, это поможет!

+0

получать эту ошибку Ошибки Curl #: SSL сертификат проблемы: не удалось получить локальный сертификат выдавшей –

+0

Поместить в этой строке коды в curl_setop_array CURLOPT_SSL_VERIFYPEER => ложно, –

+0

Новая ошибку Теперь HTTP Error 411. запрос должен быть фрагментированным или иметь длину содержимого. –

 Смежные вопросы

  • Нет связанных вопросов^_^