web-dev-qa-db-fra.com

Faire une demande de vente avec des données JSON en utilisant httpurlconnection ne fonctionne pas

J'essaie de faire une demande de vente avec des données JSON à l'aide de HttpURLConnection en Java. La façon dont je le fais ne fonctionne pas. Je n'ai aucune erreur donc je ne sais pas quel est le problème.

public static void main(String[] args) {

        URL url;
        try {
            url = new URL("http://fltspc.itu.dk/widget/515318fe17450f312b00153d/");
            HttpURLConnection hurl = (HttpURLConnection) url.openConnection();
            hurl.setRequestMethod("PUT");
            hurl.setDoOutput(true);
            hurl.setRequestProperty("Content-Type", "application/json");
            hurl.setRequestProperty("Accept", "application/json");

            String payload = "{'pos':{'left':45,'top':45}}";

            OutputStreamWriter osw = new OutputStreamWriter(hurl.getOutputStream());
            osw.write(payload);
            osw.flush();
            osw.close();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

Et voici la demande que j'essaie de faire:

Screenshot from Chrome Developer Tools

Je faisais déjà des demandes d'obtention de la ressource dans la même application et cela a fonctionné bien. Je serais très reconnaissant pour tous les conseils sur la façon dont puis-je déboguer cela ou comment puis-je essayer de le faire d'une autre manière. Jusqu'à présent, j'ai essayé uniquement d'utiliser OutputStream au lieu de OutputStreamWriter mais cela ne fonctionne pas non plus.

10
Booyaches

La mise en œuvre du Sun (Oracle) de HttpurlConnection cache le contenu de votre message à moins que vous ne le disiez en mode streaming. Le contenu sera envoyé si vous démarrez une interaction avec la réponse telle que:

hurl.getResponseCode();

De plus, selon RFC 4627, vous ne pouvez pas utiliser de guillemets simples dans votre JSON (bien que certaines implémentations semblent ne pas s'en soucier).

Alors, changez votre charge utile sur:

String payload = "{\"pos\":{\"left\":45,\"top\":45}}";

Cet exemple fonctionne pour moi

public class HttpPut {
    public static void main(String[] args) throws Exception {
        Random random = new Random();
        URL url = new URL("http://fltspc.itu.dk/widget/515318fe17450f312b00153d/");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("PUT");
        connection.setDoOutput(true);
        connection.setRequestProperty("Content-Type", "application/json");
        connection.setRequestProperty("Accept", "application/json");
        OutputStreamWriter osw = new OutputStreamWriter(connection.getOutputStream());
        osw.write(String.format("{\"pos\":{\"left\":%1$d,\"top\":%2$d}}", random.nextInt(30), random.nextInt(20)));
        osw.flush();
        osw.close();
        System.err.println(connection.getResponseCode());
    }
}
26
Roger Lindsjö