php file_get_content возвращает 401 при ошибке

У меня есть веб-приложение и API, и моя система входа в систему работает с API, поэтому она повторяется: статус заголовка 200, если он успешен (имя пользователя и пароль верны), в противном случае он возвращает HTTP/1.0 401 Неавторизованное и json-сообщение, например: {success: 0 , "неправильно имя пользователя/пароль"} (проверено с помощью плагина POSTMEN в google chrome)

Например, если я хочу сделать запрос:

$method = "login";
$data = array("user"=>"test", "pass"=>"test");
send_re($method, $data);

это моя функция send_re

function send_re($method, $data){
$url = "api.location/".$api_method;
    $options = array(
      'http' => array(
        'method'  => 'POST',
        'content' =>  http_build_query($data),
        'header'=>  "Content-Type: application/x-www-form-urlencoded\r\n" 

        )
    );

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

    return stripslashes( json_encode( $result) );
}

если мои $data верны, например, имя пользователя и пароль, но если это не так, я не получаю сообщение об ошибке, но это:

A PHP Error was encountered

Severity: Warning

Message: file_get_contents(http://85.10.229.108/home/login): failed to open stream: HTTP request       
 HTTP/1.0 401 Unauthorized

 Filename: libraries/api.php

Есть ли способ избежать этой проблемы и получить сообщение от API?


person Sabri Aziri    schedule 29.06.2013    source источник
comment
Вы пытались поставить @ перед file_get_contents для подавления предупреждений?   -  person luk2302    schedule 29.06.2013
comment
да, он не показывает ошибку с @, но не возвращает ответ json e.x: {success: 0 , "wrong username/password"}   -  person Sabri Aziri    schedule 29.06.2013
comment
Это в значительной степени ожидаемое поведение, поскольку HTTP 401 указывает на ошибку и не возвращает ничего, кроме самой ошибки, я думаю. Я предполагаю, что вы создаете ошибку через header() в вызываемом скрипте?   -  person luk2302    schedule 29.06.2013
comment
использование @ действительно должно подавлять предупреждение, но оно также подавляет сообщения о более серьезных ошибках. Не лучшая практика.   -  person Daniel P    schedule 29.06.2013
comment
@ luk2302 да, заголовок 401 создается в вызываемом скрипте.   -  person Sabri Aziri    schedule 29.06.2013
comment
нет, не лучший, лучше всего было бы не создавать 401 а просто проверять полученные json-данные   -  person luk2302    schedule 29.06.2013
comment
Я бы предложил удалить 401, потому что он создает больше проблем, чем решает. вы уже отправляете необходимые данные в строке json, хотя заголовок 401 не нужен.   -  person luk2302    schedule 29.06.2013
comment
ну, я не создал API, поэтому мне нужно решение или свяжитесь с администратором API, чтобы изменить его. :D   -  person Sabri Aziri    schedule 29.06.2013
comment
Не слишком ли надумано выдавать для этого ошибку 401? Ошибка 401 на самом деле говорит о том, что ваш скрипт не авторизован для получения страницы.   -  person Daniel P    schedule 29.06.2013


Ответы (1)


function send_re($method, $data){
$url = "api.location/".$api_method;
    $options = array(
      'http' => array(
        'method'  => 'POST',
        'content' =>  http_build_query($data),
        'header'=>  "Content-Type: application/x-www-form-urlencoded\r\n",
        'ignore_errors' => true

        )
    );

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

    return stripslashes( json_encode( $result) );
}

Просто добавьте 'ignore_errors' => true и все получится.

ссылка: http://php.net/manual/en/context.http.php

person Felipph Calado    schedule 13.03.2017