Вот чистая версия на основе lodash, которая работает с вложенными объектами
/**
* Sort of the keys of an object alphabetically
*/
const sortKeys = function(obj) {
if(_.isArray(obj)) {
return obj.map(sortKeys);
}
if(_.isObject(obj)) {
return _.fromPairs(_.keys(obj).sort().map(key => [key, sortKeys(obj[key])]));
}
return obj;
};
. Было бы даже более чистым, если бы у lodash был метод toObject()
...
Такого рода вещь является намного более легким использованием библиотеки как HttpClient. Существует даже пример кода XML сообщения:
PostMethod post = new PostMethod(url);
RequestEntity entity = new FileRequestEntity(inputFile, "text/xml; charset=ISO-8859-1");
post.setRequestEntity(entity);
HttpClient httpclient = new HttpClient();
int result = httpclient.executeMethod(post);
Не забывайте использовать:
connection.setDoOutput( true)
если Вы предназначаете при отправке вывода.
Я рекомендую использовать Apache HTTPClient вместо этого, потому что это - более хороший API.
Но решить эту текущую проблему: попытайтесь звонить connection.setDoOutput(true);
после открытия соединения.
StringBuilder sb= new StringBuilder();
sb.append("Hello there");
URL url = new URL("theservlet's URL");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Length", "" + sb.length());
OutputStreamWriter outputWriter = new OutputStreamWriter(connection.getOutputStream());
outputWriter.write(sb.toString());
outputWriter.flush();
outputWriter.close();
Содержание потока загрузки сообщения HTTP и механика его, кажется, не то, чем Вы ожидаете, что они будут. Вы не можете только записать файл как содержание сообщения, потому что POST имеет очень определенные стандарты RFC о том, как данные, включенные в запрос POST, как предполагается, отправляются. Это не просто отформатированное из самого содержания, но и это - также механик того, как это "записано" в outputstream. Много времени POST теперь записано в блоках. При рассмотрении исходного кода HTTPClient Apache, Вы будете видеть, как он пишет блоки.
Существуют причуды с длиной содержания как результат, потому что длина содержания увеличена небольшим числом, определяющим блок и случайную маленькую последовательность символов, которая разграничивает каждый блок, как это записано по потоку. Посмотрите на некоторые из других методов, описанных в более новых версиях Java HTTPURLConnection.
Если Вы не знаете то, что Вы делаете и не хотите изучать это, имея дело с добавлением зависимости как Apache, HTTPClient действительно заканчивает тем, что был намного легче, потому что это абстрагирует всю сложность и просто работает.