PHP Problema chiamata WebService con PHP

Stato
Discussione chiusa ad ulteriori risposte.

__Othon__

Utente Emerald
6 Giugno 2014
610
92
207
531
Buon pomeriggio a tutti,

Vi scrivo per chiedervi aiuto su un bug abbastanza curioso.

Ho nel mio software web una chiamata al WS per inserire un record nel db.
Come parametro della chiamata gli passo una variabile $_POST['descrizione'] che può contenere un testo.

Il problema sta qui:
Se descrizione contiene una sola parola tutto funziona regolarmente.
Se descrizione contiene più di una parola (quindi con spazi) la chiamata al WS fallisce con motivo "Bad request".

La curiosità è che se mi faccio stampare la chiamata con un die o con un echo dalla pagina php e incollo la chiamata su postman o qualsiasi ambiente di test api rest la chiamata funziona come deve.
 
Hai provato a fare url encoding del campo "descrizione"? Non vorrei che magari gli spazi o i caratteri speciali "rompessero" il body della chiamata, risultando quindi un una richiesta troncata a metà
 
Dopo ci provo, la cosa strana è che su un tester api online va. La cosa che mi viene in mente che i tester api hanno l'url encoding. Però poi sul DB cosa mi arriverebbe? Il codice "spazio" quindi non va bene e dubito quindi che gli altri tester abbiano questa cosa.
 
Mmm... sinceramente non so, mi viene un dubbio. Penso che arrivi tutto URL-encodato, e poi da backend prima di salvare il dato lo riporti in "forma normale", però non ne sono sicuro, non mi vorrei sbagliare.
Hai provato a debuggare con un proxy intermedio tipo burpsuite, per vedere le differenze tra le due chiamate?
 
Il beck end l ho creato io come il front end e il db. Sul beck end non faccio nessuna decodifica. Su postman gli metto la chiamata url e tutto funziona con la descrizione con spazi sul db per questo mi torna strano fare l encoding url
 
Il beck end l ho creato io come il front end e il db. Sul beck end non faccio nessuna decodifica. Su postman gli metto la chiamata url e tutto funziona con la descrizione con spazi sul db per questo mi torna strano fare l encoding url
Se è un parametro POST molto sicuramente non sarà un problema di url encoding (mi sembra veramente strano ahah). Quello che ti posso dire di fare per migliorare le informazioni in nostro possesso è di:
  • Apri la console sviluppatori dal tuo browser che usi per debuggare
  • Intercetta la richiesta che viene fatta al tuo WS
Dopodichè posta qui sia la formatazzione della richiesta, sia quella della risposta.
Già che ci sei... posta pure il codice del metodo WS che dovrebbe essere eseguito ;)
 
***.*******.***:****/Operation/assessment_aggiorna?iCancellato=0&sOperatore=******&sToken=******&iId=1&fkAzienda=0&sDataAssessment=01-12-2020&titolo=ssgsgòj&descrizione=test test test ciao prova bip&Note=0&stato=2&idNormativa=0&categorie=0

Il metodo ws non fa altro che un add with value su una stored procedure DB
 
***.*******.***:****/Operation/assessment_aggiorna?iCancellato=0&sOperatore=******&sToken=******&iId=1&fkAzienda=0&sDataAssessment=01-12-2020&titolo=ssgsgòj&descrizione=test test test ciao prova bip&Note=0&stato=2&idNormativa=0&categorie=0

Il metodo ws non fa altro che un add with value su una stored procedure DB
Da quanto vedo gli stai passando i parametri della POST all'interno della QUERYSTRING dell'URL, non nel BODY.
Solitamente quando si vanno a scrivere tanti dati o comunque su operazioni di scrittura, si evita di passare i dati nell'URL.
 
Potresti postare il codice che utilizzi lato frontend per chiamare il WS? Almeno ho modo di capire cosa sbagli :)
PHP:
function CallAPI($method, $url, $data = false) {
    $curl = curl_init();

    switch ($method)
    {
        case "POST":
            curl_setopt($curl, CURLOPT_POST, 1);

            if ($data) {
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            }
            break;
        case "PUT":
            curl_setopt($curl, CURLOPT_PUT, 1);
            break;
        default:
            if ($data)
                $url = sprintf("%s?%s", $url, http_build_query($data));
    }

    // Optional Authentication:
    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($curl, CURLOPT_USERPWD, "username:password");

    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

    $result = curl_exec($curl);

    curl_close($curl);

    return $result;
}

Ecco a te
 
Ho trovato sul Web Service la funzione [FromBody] (C#) Il problema è che è possibile metterci un solo parametro.

Consigli? A me è venuto in mente di creare un oggetto che contenga tutti i parametri desiderati ma boh, mi sembra al quanto sporca come soluzione.
 
Ultima modifica:
Ho trovato sul Web Service la funzione [FromBody] (C#) Il problema è che è possibile metterci un solo parametro.

Consigli? A me è venuto in mente di creare un oggetto che contenga tutti i parametri desiderati ma boh, mi sembra al quanto sporca come soluzione.
In realtà è giusto così. Nel body hai un "oggettone" che contiene tutte le informazioni necessarie al WS.
Anche perchè lato frontend mi sembra tutto corretto, quindi deduco il problema sia lato WS.
 
Stato
Discussione chiusa ad ulteriori risposte.