php file_get_content връща 401 на неуспешно

Имам уеб приложение и api и системата ми за влизане работи с api, така че се връща: състояние на заглавка 200, ако е успешно (потребителското име и паролата са правилни), в противен случай връща HTTP/1.0 401 Неупълномощено и json съобщение e.x: {success: 0, "неправилно потребителско име/парола"} (тествано с приставката POSTMEN в google chrome)

За e.x, ако искам да направя заявка:

$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 са правилни e.x потребителско име и парола, но ако не са, не получавам съобщение за грешка, а това:

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, за да го промените. :Д   -  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