Jackson - >Jackson + HttpPost = "недопустимый средний байт UTF-8", настройка Mime и кодирования
я использую Apache HTTP Client libs и Jackson в моем клиенте. Когда я отправляю JSON на сервер, я получаю сообщение об ошибке:
org.codehaus.jackson.JsonParseException: Invalid UTF-8 middle byte 0x65
at [Source: HttpInputOverHTTP@22a4ac95; line: 1, column: 81]
если я не устанавливаю заголовки, чем я получаю invalid media type
, который имеет смысл.
если я использую curl и те же заголовки, сервер принимает его, поэтому я думаю, что сервер в порядке (и просто совпадение, что он также использует Jackson)
Это документ; я жестко закодировал его как Java-литерал, используя только 8-битные символы, чтобы избежать каких-либо другое место для калечить случиться
// "Strau00DFe" = "Straße"
static String TINY_UTF8_DOC = "[{ "id" : "2", "fields" : { "subject" : [{ "name" : "subject", "value" : "Strau00DFe" }] } }]";
вот код, который я использовал, и комментарии с различными попытками:
HttpClient httpClient = new DefaultHttpClient();
HttpPost post = new HttpPost( url );
// Attempt A
// post.setEntity( new StringEntity( content ) );
// Attempt B
// post.setEntity( new StringEntity( content ) );
// post.setHeader("Content-Type", "application/json; charset=utf-8");
// Attempt C
// post.setEntity( new StringEntity( content, ContentType.create("application/json") ) );
// Attempt D
// post.setEntity( new StringEntity( content, ContentType.create("application/json; charset=UTF-8") ) );
// Attempt F
// post.setEntity( new StringEntity( content, ContentType.create("application/json; charset=utf-8") ) );
// Attempt G
// StringEntity params = new StringEntity( content );
// params.setContentType("application/json; charset=UTF-8");
// post.setEntity(params);
// And then send to server
HttpResponse response = httpClient.execute( post );
int code = response.getStatusLine().getStatusCode();
// ...etc...
другие странные вещи, которые я заметил:
- некоторое время это вело себя по-разному на Eclipse на Mac против запуска .jar на Linux; очевидно, что это симптом специфичного для платформы кодирования или декодирования, но я не знаю, где. Как ни странно, что когда я устанавливаю Eclipse для обработки кода как UTF-8 (против ASCII) Я подозреваю, что это важная подсказка, но не уверен, где она подходит.
- я видел раз, когда вместо 2 байтов в потоке есть 4 байта, хотя это могло быть другой проблемой кодирования при записи на диск, хотя я специально устанавливал UTF-8 в файле IO
- когда я смотрю на строковый объект в отладчике, я вижу байты, но 8-битный символ является отрицательным числом. Когда вы запускаете математику комплиментов двух, Это все еще правильный Unicode кодовая точка, так что номинально нормально, предполагая, что httpclient не глючит.
действительно из идей, и, как я сказал, он работает с curl, поэтому я думаю, что сервер в порядке.
Edit:
curl работает при публикации на сервере, но я не могу поделиться кодом сервера. Было указано, что, поскольку curl не написан на Java, и поэтому, возможно, он ведет себя по-другому, и поэтому код сервера все еще может быть подозрительным.