Visualizzazione risultati 1 fino 10 di 10

Discussione: MethodNotAllowedHttpException curl http 405

  1. #1
    productlab non è connesso Neofita
    Data registrazione
    12-11-2014
    Messaggi
    5

    Exclamation MethodNotAllowedHttpException curl http 405

    Salve.
    Ho tentato di stabilire una conessione server-to-server utilizzando cURL.
    Nelle impostazione php ho abilitato api esterne senza limiti.
    L'idea è di fare una richiesta POST passando i dati in formato JSON, che sono le credenziali per autorizzazione.
    La risposta dall'api esterna è nel formato JSON.
    Lo script si trova fisicamente su: risposta dall'api esterna con errore
    Ecco il codice dello script:
    Codice PHP:
    <?php
    $url
    = 'http://api.example.it/events';

    $data = array(
    'username'=>'username',
    'password'=>'password'
    );

    $jsonDataEncoded = json_encode($data);

    $ch = curl_init();
    $curlOptions = array(CURLOPT_URL => $url,
    CURLOPT_POST => 1,
    CURLOPT_POSTFIELDS => $jsonDataEncoded,
    CURLOPT_HEADER => 1,
    CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'Content-Length: ' . strlen($jsonDataEncoded),
    'Accept: application/json, text/javascript, */*; q=0.01'
    ),
    CURLOPT_RETURNTRANSFER => 1
    );


    curl_setopt_array($ch, $curlOptions);
    $result = curl_exec ($ch);

    var_dump(curl_getinfo( $ch ));
    curl_close($ch);

    echo
    $result;
    ?>
    Lo script funziona perfettamente sul mio server locale e anche sull'altro mio server publico.
    Solo qui su altervista mi da un'errore:
    MethodNotAllowedHttpException in Application.php line 1259:

    Credo che il problemma è nella versione php.
    Come è possibile passare e ricevere JSON con la richiesta POST qui su altervista. Ho impostato la versione di PHP 5.4 (ultima disponibile in questo momento)
    Ultima modifica di productlab : 09-02-2016 alle ore 17.41.08 Motivo: url

  2. #2
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,896

    Predefinito

    ehm il metodo Post naturale come funziona? Fatti questa domanda in primo luogo. Praticamente tu devi cercare di inviare un file, quindi postfields dovrebbe essere un array così viene inviato con gli header boundary. Cerca in rete php file con curl.(perché le richieste normali di post funzionano così io invio due dati ad esempio: name1=valore&name2=valore nello standard input, cioè quando il postdatafields è stringa equivalente a application/x-www-form-urlencoded). Quindi è irrilevante che gli altri server funzionano, visto che non è un post normale non dovrebbero neanche funzionare di giusto.
    Ultima modifica di darbula : 09-02-2016 alle ore 15.08.19

  3. #3
    productlab non è connesso Neofita
    Data registrazione
    12-11-2014
    Messaggi
    5

    Predefinito

    Grazie, darbula, della tua risposta.
    Non capisco perche dici che devo inviare il file. Il mio caso è inviare i dati post nel formato JSON e non il file JSON. Infatti potevo scrivere direttamente:
    Codice PHP:
    CURLOPT_POSTFIELDS => "{\"username\":\"username\",\"password\":\"password\"}";
    Ho usato ivece la funzione json_encode che mi transforma un array php nella stringa json.
    Per ciò ho specificato nella header il Content-Type relativo:
    Codice PHP:
    CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'Content-Length: ' . strlen($jsonDataEncoded)
    )
    Nel locale c'è l'ho un server con php 5.6. La richiesta va a buon fine, ricevo una risposta con header:
    Codice:
    HTTP/1.1 200 OK
    Date: Tue, 09 Feb 2016 13:56:00 GMT
    Server: Apache
    Access-Control-Allow-Origin: http://productlab.altervista.org
    Cache-Control: no-cache
    Set-Cookie: laravel_session=eyJpdiI6...; 
    expires=Tue, 09-Feb-2016 15:56:00 GMT; Max-Age=7200; path=/; httponly
    Transfer-Encoding: chunked
    Content-Type: application/json
    più un JSON di risposta:
    Codice:
    {"reply":{
    "api_call":"event\/month",
    "method":"POST",
    "result":"OK",
    "data_richiesta":"09\/02\/2016",
    "content":[{"id":1516,"category_id":3,"category_name":"Biblioteca....
    Su altervista, invece, la header di rispodsta è:
    Codice:
    HTTP/1.0 405 Method Not Allowed
    Cache-Control: no-cache, private
    Date: Tue, 09 Feb 2016 13:57:10 GMT
    Server: Apache
    Allow: POST
    Content-Type: text/html; charset=UTF-8
    più un grande html con dei dati di errori, lo puoi vedere su :
    http://productlab.altervista.org/cms...ternal_cfv.php

  4. #4
    productlab non è connesso Neofita
    Data registrazione
    12-11-2014
    Messaggi
    5

    Predefinito

    Ho provato con altro metodo:
    Codice PHP:
    <?php
    $data
    = array(
    'username'=>'username',
    'password'=>'password'
    );
    $url = 'http://api.example.it/events';
    $opts = array('http' =>
    array(
    'method' => 'POST',
    'header' => "Accept: application/json\r\n"
    . "Content-Type: application/json\r\n",
    'content' => json_encode($data)
    )
    );
    $context = stream_context_create($opts);
    $fp = @fopen($url, 'rb', false , $context);
    if (!
    $fp) {
    throw new
    Exception("Problem with $url, $php_errormsg");
    }
    $result = @stream_get_contents($fp);
    if (
    $result === false) {
    throw new
    Exception("Problem reading data from $url, $php_errormsg");
    }
    echo
    $result;
    Sul server con PHP 5.6 ricevo correttamente la risposta.
    L'altervista con PHP 5.4 si ferma sulla riga 18:
    Codice:
    Fatal error: Uncaught exception 'Exception' with message 'Problem with http://api.comunecastelfranco.it/event/month, '
    in /membri/productlab/cms/livemap/db/rest_helper.php:18 Stack trace: #0 {main} thrown in
    /membri/productlab/cms/livemap/db/rest_helper.php on line 18
    Ultima modifica di productlab : 09-02-2016 alle ore 17.41.42 Motivo: url

  5. #5
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,896

    Predefinito

    prego figurati. Non avevo notato che ti riferivi ad api esterne è quindi sei obbligato ad inviare in formato json. Semplicemente era un consiglio se dovevi creare questa api nel tuo server, visto che il metodo post si utilizza con due modi standard (in verità esiste anche il terzo,cioè testo puro). Spero che qualcuno di competente possa dirti perché secondo altervista ti dice metodo non permesso. ps. il primo script in se è scritto sintatticamente corretto.
    Nel frattempo se ti va di spenderci tempo, potresti provare tutto qui su altervista. Cioè da pagina A invi i dati con metodo POST nel formato json in pagina B. ps. senza
    Codice PHP:
    CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'Content-Length: ' . strlen($jsonDataEncoded),
    'Accept: application/json, text/javascript, */*; q=0.01'
    ),
    da pagina B recuperi lo standard input
    Codice PHP:
    if(($a=file_get_contents('php://input'))){
    //qualsiasi tipo di codice php echo $a;
    }else{
    echo
    'errore';
    }
    scusami io al momento non riesco a connettermi dal mio server. Sto cercando di circoscrivere l'errore in questo modo. Può darsi che si riveli inutile anche questo tentativo.
    Ultima modifica di darbula : 09-02-2016 alle ore 23.18.39

  6. #6
    productlab non è connesso Neofita
    Data registrazione
    12-11-2014
    Messaggi
    5

    Predefinito

    Ciao, darbula.
    Ho fatto la seguente prova:
    2 file.
    1. su altervista lo script api_test.php fà la richesta post su un host esterno provissorio (l'ho fatto giusto per testare le chiamate server-to-server), passando la stringa json in postfields.
    Codice PHP:
    <?php
    $url_local_api
    = "http://productlab.altervista.org/cms/livemap/db/_local_api.php";
    $url_remote_api = "http://productlab.freevar.com/_remote_api.php";
    $data = array(
    'username'=>'username',
    'password'=>'password'
    );
    $jsonDataEncoded = json_encode($data);

    $ch = curl_init();
    $curlOptions = array(CURLOPT_URL => $url_remote_api,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'Content-Length: ' . strlen($jsonDataEncoded)
    ),
    CURLOPT_POSTFIELDS => $jsonDataEncoded,
    CURLOPT_RETURNTRANSFER => 1
    );


    curl_setopt_array($ch, $curlOptions);
    $result = curl_exec ($ch);
    if (
    curl_errno($ch)) {
    print
    "Error: " . curl_error($ch);
    }
    curl_close($ch);
    var_dump($result);
    2. Sul server remoto lo script _remote_api.php riceve la chiamata, guarda php://input ed echo un json di risposta indietro:
    Codice PHP:
    <?php

    header
    ('Content-Type: application/json');
    header('Allow: POST');
    $a = array();
    if(!(
    $a['php_input']=file_get_contents('php://input'))){
    $a['php_input'] = array("error" => "no input");
    }
    if(isset(
    $_POST)) {
    $a['post_values'] = $_POST;
    }
    echo
    json_encode($a);
    ?>
    Ed funziona tutto perfettamente.
    Ho provato anche ad interno di altrvista utilizzando url locale _local_api.php
    ed è tutto a posto.
    nota: I header content-type e allow: post non servono neanche (ho testato anche senza)

    INVECE

    Il server del api che voglio realmente usare mi torna un errore.
    Lo script api_external_cfv.php ha la stessa identica struttura. Siccome ho capito, tutto quel html di errori è la risposta dal server remoto (risposta dell'api), e quindi, l'errore sucede lì e non su altervista, e giusto?. Prova dare un'occhiata sulla risposta, la trovi sempre su api_external_cfv.php

    RIMANE il fatto, però, che api_external_cfv.php sul mio server locale e sull'altro host publico funziona correttamente, riceve la risposta dell'api che voglio usare...
    Ultima modifica di productlab : 10-02-2016 alle ore 11.48.06 Motivo: api_test.php, aggiunto i header con content-type e content-length

  7. #7
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,896

    Predefinito

    ciao, io direi di basarci su quello che sappiamo piuttosto di capire l'ignoto. Quindi sappiamo se si fa una richiesta con gli header Content-Length e Content-Type dove quest'ultimo è presente anche nella risposta e sia richiesta che risposta da altervista viene effettuata correttamente (abbiamo clonato la risposta del server esterno in caso di esito positivo).Ti faccio una domanda,se provi a connetterti senza POST e senza dati, cioè tramite url la richiesta va a buon fine?(nel senso che non vieni bloccato da quel ip) Dando per scontato che il protocollo che stai utilizzando è http e non https, puoi provare ad aggiungere queste due option
    Codice PHP:
    //su altervista produce un warning CURLOPT_FOLLOWLOCATION => 0
    CURLINFO_HEADER_OUT => 1
    Così non tralasciamo nulla! altervista dovrebbe inserire alcuni header,tipo user-agent, via e forse altri. Se si ferma lo script anche su un server che non sia altervista abbiamo trovato l'errore, altrimenti al momento non ho più idee. ps. Gli utilizzi di header allow e $_POST non hanno senso in questo contesto, perché anche quando si ricevono i dati POST ma non sono nella forma name=valore $_POST sarà vuoto altrimenti verrà creato $_POST['name'], I'header allow va abbinato solo con un codice di stato 405 method not allowed.
    Ultima modifica di darbula : 10-02-2016 alle ore 19.42.10 Motivo: aggiunto FOLLOWLOCATION

  8. #8
    productlab non è connesso Neofita
    Data registrazione
    12-11-2014
    Messaggi
    5

    Predefinito

    Ho impostato un'ulteriore ponte su un'altro server e va bene così, per adeso. Qui, su altervista, non ho nessun controllo, non vedo i log... e poi, ho cercato dappertutto sul portale come contattare il supporto, unica cosa che ho trovato è bug report. Ho segnalato il mio problema come bug settimana fa, ma non ho avuto nessuna risposta...

  9. #9
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,745

    Predefinito

    Citazione Originalmente inviato da productlab Visualizza messaggio
    Qui, su altervista, non ho nessun controllo, non vedo i log... e poi, ho cercato dappertutto sul portale come contattare il supporto, unica cosa che ho trovato è bug report. Ho segnalato il mio problema come bug settimana fa, ma non ho avuto nessuna risposta...
    Il supporto viene fornito qua nel forum, ma in questo caso come hai già specificato tu non è un problema di AlterVista: l'errore è sul server remoto che per qualche ragione non riesce ad elaborare correttamente la richiesta.

  10. #10
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,896

    Predefinito

    Possibilmente il problema è proprio l'header User-Agent obbligatoriamente inserito da altervista. Dai test effettuati inserendo l'User-Agent, user e password errati, ottengo la risposta con metodo GET e non POST dentro il json.Sempre presumo! Ciò merita ulteriori test (possibilmente clonando tutti gli header di altervista nel server che effettua la richiesta in modo corretto) per essere sicuro devi ricreare lo stesso problema (errore).
    ps. Per recuperare gli header effettuati da altervista dentro altervista è possibile solo con apache_request_headers()
    Ultima modifica di darbula : 13-02-2016 alle ore 02.02.10

Tags for this Thread

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •