Qual è il modo corretto per passare oggetti JSON in una richiesta http quando una richiesta GET è più appropriata?

4

Uno scenario è quando si sta creando un endpoint di ricerca. Nell'esempio seguente, voglio cercare un database di aziende e le query possono diventare complicate; abbastanza dove voglio avere i parametri passati come oggetti JSON invece di un elenco semplice.

var hapi = require('hapi');
var joi = require('joi');

var server = new hapi.Server();
server.connection({port: 5555});

var simpleRoute = {
    method: 'GET',
    path: '/company/search',
    config: {
        validate: {
            query: {
                company: joi.object().keys({
                    name: joi.string(),
                    address: joi.string()
                })
            }
        }
    },
    handler: (request, reply) => {
        reply({
            input: request.query,
            results: 'SOME RESULTS'
        });
    }
};

server.route(simpleRoute);

server.start(() => {
    console.log('server started -- ' + server.info.uri);
});

E l'url per questo assomiglia a http://localhost:5555/company/search?company=%7B%22name%22%3A%22Cuthbert%22%2C%22address%22%3A%22123%20Main%20St%22%7D .

L'url è disordinato e non ha un bell'aspetto e per un sito Web rivolto al cliente, può essere difficile per un utente ricreare se desidera ripetere una ricerca.

C'è anche il limite di caratteri sugli url. È improbabile che lo colpisca, ma cosa succede se una query diventa troppo complessa per una richiesta GET? Posso modificare il percorso su POST / PUT, ma la ricerca non modifica anche alcun dato sul mio server.

Quindi, come faccio a passare oggetti complessi su http continuando a utilizzare correttamente GET, PUT, POST, ecc.?

    
posta Cuthbert 12.04.2016 - 20:50
fonte

2 risposte

3

Ricerca elastica ha anche questo problema: la loro soluzione era consentire Richiedi richieste con gli organismi :

$ curl -XGET 'http://localhost:9200/twitter/tweet/_search' -d '{
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}
'

Sebbene non standard, non è tecnicamente una violazione di HTTP / 1.1 :

The presence of a message body in a request is signaled by a Content-Length or Transfer-Encoding header field. Request message framing is independent of method semantics, even if the method does not define any use for a message body.

Tuttavia, RFC 7321 riconosce che i corpi delle richieste GET non hanno una semantica definita:

A payload within a GET request message has no defined semantics; sending a payload body on a GET request might cause some existing implementations to reject the request.

Per questo motivo, i clienti non hanno bisogno di supportare tecnicamente le richieste GET con i corpi, e per questo motivo, Elastic Search accetta anche le query di ricerca tramite POST.

    
risposta data 13.04.2016 - 18:33
fonte
1

Potresti usare i parametri url:      link

Oppure passa l'oggetto json come parametro di query stringa

    
risposta data 13.04.2016 - 16:22
fonte

Leggi altre domande sui tag