2015-02-15 3 views
8

Sto usando la seguente richiesta cURL per localhost che funziona bene:Come stimolare richiesta cURL per una richiesta utilizzando postino

curl -u admin:e4d4face52f2e3dc22b43b2145ed7c58ce66e26b384d73592c -d "{\"jsonrpc\": \"2.0\", \"method\": \"feed.list\", \"id\": 1}" http://localhost/minifluxR/jsonrpc.php 

Ma quando invio la stessa richiesta utilizzando postino invece di cURL, sto ottenendo:

{"jsonrpc":"2.0","id":null,"error":{"code":-32700,"message":"Parse error"}} 

In postino ho usato una richiesta GET e ha inviato il seguente come intestazioni:

url:http://localhost/minifluxR/jsonrpc.php 
username:admin 
api_token:e4d4face52f2e3dc22b43b2145ed7c58ce66e26b384d73592c 
method: feed.list 

che segue è la funzione PHP che sto cercando di innescare:

$server = new Server; 

$server->authentication(array(
    \Model\Config\get('username') => \Model\Config\get('api_token') 
)); 

// Get all feeds 
$server->register('feed.list', function() { 
    return Model\Feed\get_all(); 
}); 

Please help me per correggere questi errori.

risposta

21

Quando si utilizza cURL, il -uoption (o --user) è usato per fornire le credenziali per HTTP Basic authentication. Questo imposta l'intestazione Authorization per contenere il necessary data per l'autenticazione con il server.

Questi passaggi si applicano a Postman packaged app. Per i passaggi per l'applicazione legacy, vedere this di revisione questa risposta.

Per utilizzare l'autenticazione HTTP di base come lo siete stati nel comando Curl, fare clic sulla scheda Autorizzazione e immettere le credenziali. Cliccando su la richiesta di aggiornamento aggiungerà per te l'intestazione Authorization necessaria.


Postman's Authorization tab


Postman's Headers tab


di presentare i dati JSON nello stesso modo che hai fatto con curl, utilizzare una richiesta POST, selezionare grezzo sotto la Corpo e inserisci i tuoi dati in questo modo:


Postman's Body tab


eseguire il debug di questo ho usato Fiddler - un proxy web di debug gratuito.

ho usato l'opzione di cURL --proxy per renderlo inviare le proprie richieste attraverso Fiddler in questo modo:

curl \ 
--proxy http://localhost:8888 \ 
-u foo:bar \ 
-d "{\"jsonrpc\": \"2.0\", \"method\": \"feed.list\", \"id\": 1}" \ 
http://localhost 

Ora che la richiesta passa attraverso Fiddler, posso selezionare dalla lista delle sessioni, e utilizzare il "grezzo" ispettore di vedere la richiesta grezzo:


Fiddler's "raw" inspector


Questo mi mostra che cURL sta effettuando una richiesta POST con autenticazione HTTP Basic e il contenuto application/x-www-form-urlencoded. Questo tipo di dati è normalmente costituito da chiavi e valori, ad esempio foo=bar&hoge=fuga. Tuttavia, questa richiesta CURL sta inviando una chiave senza valore. Una chiamata a var_dump($_POST) produrrà la seguente:


var_dump output


Con un = alla fine dei dati (in questo modo: {"jsonrpc": "2.0", "method": "feed.list", "id": 1}=) il var_dump cedano seguente:


var_dump output


Tuttavia, sembra che JsonRPC utilizzerà file_get_contents('php://input') nel tuo caso. Ciò restituisce i dati inviati con la richiesta, incluso uno =, se i dati terminano con esso. Poiché proverà ad analizzare i dati di input come una stringa JSON, fallirà se la stringa termina con un =, perché sarebbe JSON non valido.

Utilizzando l'estensione per Chrome FoxyProxy, ho creato una configurazione proxy per Fiddler (127.0.0.1:8888), che mi ha permesso per eseguire il debug facilmente i dati inviati su richiesta del postino POST. Utilizzando x-www-form-urlencoded con una chiave di foo senza valore, i dati inviati erano in realtà foo=, il che comporterebbe l'invalidità della stringa JSON.

Tuttavia, l'utilizzo dell'ingresso "raw" consente di inviare i dati specificati senza aggiungere = alla fine di esso, garantendo in tal modo che i dati siano JSON validi.

+0

@ user2198400 Ho aggiornato la mia risposta per rispondere alla tua domanda sull'utilizzo di dati "grezzi". Non so di fare la risposta UTF-8. Probabilmente dovresti fare una nuova domanda per questo. – Spooky

+0

E l'autenticazione PAM? Sto cercando di simulare il seguente comando di arricciatura: '' ' curl --no-check-certificate https: // localhost: 8000/login \ -d username = myusername \ -d password = password_utente \ -d eauth = 'pam' '' ' Li ho aggiunti come parametri ma non funziona –

1

Curl utilizza l'autenticazione di base HTTP per impostazione predefinita. Le intestazioni impostate su Postman sono qualcosa di diverso. Prova a utilizzare l'autenticazione di base in Postman. È nel pannello superiore, si compila nome utente e password e verrà generata l'intestazione dell'autorizzazione.