I'm quite new to Java, but I have different results when using OutputStreamWriter and DataOutputStream with a POST request of HttpUrlConnection.
I can append parameters when I use DataOutputStream.
URL url = new URL("https://www.google-analytics.com/debug/collect");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;");
conn.setRequestMethod("POST");
String parameters = "v=1&tid=UA-62749954-12&cid=test.clientid.456&t=event&ec=offline_cv&ea=register";
DataOutputStream writer = new DataOutputStream(conn.getOutputStream());
writer.writeBytes(parameters);
writer.close();
conn.connect();
Response:
{ "hitParsingResult": [ { "valid": true, "parserMessage": [ ], "hit": "/debug/collect?v=1\u0026tid=UA-62749954-12\u0026cid=test.clientid.456\u0026t=event\u0026ec=offline_cv\u0026ea=register" } ], "parserMessage": [ { "messageType": "INFO", "description": "Found 1 hit in the request." } ]}
But, I can not append parameters when using OutputStreamWriter.
OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
writer.write(URLEncoder.encode(parameters, "UTF-8"));
Response:
{ "hitParsingResult": [ { "valid": false, "parserMessage": [ { "messageType": "ERROR", "description": "A value is required for parameter 'v'. Please see https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#v for details.", "messageCode": "VALUE_REQUIRED", "parameter": "v" } ], "hit": "/debug/collect" } ], "parserMessage": [ { "messageType": "INFO", "description": "Found 1 hit in the request." } ]}
Is it because DataOutputStream is compatible with String, and OutputStreamWriter is not?