Estic escrivint un programa de prova en Java per provar miconexiones a una api de restfull a django (djangorestframework per ser precís). Una de les opcions és provar una de les API amb ris. Executant la comanda curl des del shell funciona bé: ex.:
curl --show-error --request GET --header "Accept: application/json" --user "user:pwd" http://127.0.0.1:8000/api/v1/
Retorna molt bé les adreces URL de l’API i el text d’ajuda a format json.
Ara, quan intento invocar el mateix des de Java, utilitzant ProcessBuilder, obtinc aquesta resposta:
{"detail": "You do not have permission to access this resource. You may need to login or otherwise authenticate the request."}
El codi de Java que estic fent servir és:
ProcessBuilder p=new ProcessBuilder("curl","--show-error", "--request","GET","--header",""Accept: application/json"", "--user",""" + userName + ":" + password + """, getApiRootUrlString());final Process shell = p.start();
Perquè també agafo la seqüència d’error per:
InputStream errorStream= shell.getErrorStream();InputStream shellIn = shell.getInputStream();
Sé que inicia la comanda curl, perquè cometre un error en una de les opcions mostra el text d’ajuda de curl.
No estic segur de quina és la diferència entre invocar, bastant segur que és el mateix ordre.
per cert, “getApiRootUrlString ()” torna la url correcta: http://127.0.0.1:8000/api/v1/
Respostes
5 per a la resposta № 1
Cada cadena que passi a la ProcessBuilder
el constructor representa un argument, de manera que no necessita les cometes que tindria de fer servir amb el shell. Proveu el següent:
ProcessBuilder p=new ProcessBuilder("curl","--show-error", "--request","GET","--header","Accept: application/json", "--user", userName + ":" + password, getApiRootUrlString());
Si utilitzeu cometes, es converteixen en part de la valor que es passa a el procés, pel que estava intentant autenticar amb un nom d’usuari de "user
i una clau d’pwd"
.