Jackson->Jackson + HttpPost =“无效的UTF-8中间字节”,设置Mime和编码

2024-02-19

我在我的客户端中使用 Apache HTTP 客户端库和 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)

这是文件;我仅使用 8 位字符将其硬编码为 Java 文字,以避免在任何其他地方发生损坏

// "Stra\u00DFe" = "Straße"
static String TINY_UTF8_DOC = "[{ \"id\" : \"2\", \"fields\" : { \"subject\" : [{ \"name\" : \"subject\", \"value\" : \"Stra\u00DFe\" }] } }]";

这是我一直在使用的代码,以及各种尝试的评论:

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...

我注意到的其他奇怪的事情:

  • 有一段时间,这在 Mac 上的 Eclipse 上与在 Linux 上运行 .jar 的表现有所不同;显然,这是特定于平台的编码或解码的症状,但我不知道在哪里。讽刺的是broke当我将 Eclipse 设置为将代码视为 UTF-8(相对于 ASCII)时,我怀疑这是一个重要的线索,但不确定它适合在哪里。
  • 我见过几次,流中不是 2 个字节,而是 4 个字节,尽管这在写入磁盘时可能是不同的编码问题,尽管我在文件 IO 上专门设置了 UTF-8
  • 当我在调试器中查看字符串实体时,我看到了字节,但 8 位字符是负数。当您运行“二人赞美”数学时,它仍然是正确的 Unicode 代码点,因此名义上没问题,假设 httpclient 没有错误。

真的没有想法,正如我所说,它与curl一起工作,所以我认为服务器没问题。

Edit:

发布到服务器时,curl 可以工作,但我无法共享服务器代码。有人指出,由于curl不是用Java编写的,因此它的行为可能有所不同,因此服务器代码仍然值得怀疑。

因此,作为进一步的测试,下面的代码确实NOT使用 Apache httpclient 库,并且在发布到服务器时确实有效。这证明服务器没问题,但我在客户端使用 Apache 库的方式仍然有问题(或者可能有错误)。

非 apache-httpclient 代码,确实有效:

import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;

class PostUtf8 {
    static String POST_URL = "http://...";

    // \u00DF = LATIN SMALL LETTER SHARP S, looks like letter B
    static String TINY_UTF8_DOC = "[{ \"id\" : \"2\", \"fields\" : { \"subject\" : [{ \"name\" : \"subject\", \"value\" : \"Stra\u00DFe\" }] } }]";

    public static void main( String [] args ) throws Exception {
        System.out.println( "Posting to " + POST_URL );
        URL url = new URL( POST_URL );
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestProperty( "Content-Type", "application/json; charset=UTF-8" );
        conn.setRequestMethod("POST");
        conn.setDoOutput(true);
        OutputStream sout = conn.getOutputStream();
        OutputStreamWriter wout = new OutputStreamWriter(sout, "UTF-8" );
        wout.write( TINY_UTF8_DOC );
        wout.flush();
        int result = conn.getResponseCode();
        System.out.println( "Result = " + result );
    }
}

看起来问题是如何ContentTypeHttpClient 的参数StringEntity正在创建构造函数。

使用ContentType.APPLICATION_JSON常量作为参数(对应于“application/json; charset=utf-8”mime 类型)使一切正常。

以下是将 JSON 字符串发布到公共 http 服务的示例,该服务将请求回显给客户端:

public class HttpClientEncoding {

    static String TINY_UTF8_DOC = "[{ \"id\" : \"2\", \"fields\" : { \"subject\" : " +
            "[{ \"name\" : \"subject\", \"value\" : \"Stra\u00DFe\" }] } }]";

    public static void main(String[] args) throws IOException {
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost post = new HttpPost("http://httpbin.org/post");
        StringEntity entity = new StringEntity(TINY_UTF8_DOC, ContentType.APPLICATION_JSON);
        //StringEntity entity = new StringEntity(TINY_UTF8_DOC, ContentType.create("application/json; charset=utf-8"));
        post.setEntity(entity);
        HttpResponse response = httpClient.execute(post);
        String result = EntityUtils.toString(response.getEntity());
        System.out.println(result);
        ObjectMapper mapper = new ObjectMapper();
        JsonNode node = mapper.readValue(result, JsonNode.class);
        System.out.println(node.get("json").get(0).get("fields").get("subject").get(0).get("value").asText());
    }
}

Output:

{
  "origin": "46.9.77.167",
  "url": "http://httpbin.org/post",
  "args": {},
  "data": "[{ \"id\" : \"2\", \"fields\" : { \"subject\" : [{ \"name\" : \"subject\", \"value\" : \"Stra\u00dfe\" }] } }]",
  "files": {},
  "form": {},
  "headers": {
    "Content-Length": "90",
    "User-Agent": "Apache-HttpClient/4.3.3 (java 1.5)",
    "Host": "httpbin.org",
    "Connection": "close",
    "X-Request-Id": "c02864cc-a1d6-434c-9cff-1f6187ceb080",
    "Content-Type": "application/json; charset=UTF-8"
  },
  "json": [
    {
      "id": "2",
      "fields": {
        "subject": [
          {
            "value": "Stra\u00dfe",
            "name": "subject"
          }
        ]
      }
    }
  ]
}
Straße
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jackson->Jackson + HttpPost =“无效的UTF-8中间字节”,设置Mime和编码 的相关文章

  • 两个整数乘积的模

    我必须找到c c a b mod m a b c m 是 32 位整数 但 a b 可以超过 32 位 我正在尝试找出一种计算 c 的方法 而不使用 long 或任何 gt 32 位的数据类型 有任何想法吗 如果m是质数 事情可以简化吗 注
  • Android:文本淡入和淡出

    我已阅读此 stackoverflow 问题和答案 并尝试实现文本淡入和淡出 Android中如何让文字淡入淡出 https stackoverflow com questions 8627211 how to make text fade
  • 什么是抽象类? [复制]

    这个问题在这里已经有答案了 当我了解抽象类时 我说 WT H 问题 创建一个无法实例化的类有什么意义呢 为什么有人想要这样的课程 什么情况下需要抽象类 如果你明白我的意思 最常见的是用作基类或接口 某些语言有单独的interface构建 有
  • 如何在 JPQL 或 HQL 中进行限制查询?

    在 Hibernate 3 中 有没有办法在 HQL 中执行相当于以下 MySQL 限制的操作 select from a table order by a table column desc limit 0 20 如果可能的话 我不想使用
  • 在android中从JSON生成listview

    我对 Android 完全陌生 目前正在尝试从从我的服务器中提取的 JSON 数组生成列表视图 我已经阅读了很多教程 但没有运气 有一种独特的方法可以做到这一点 请您指出一些适合开始的资源 我读过了this http www josecgo
  • 将巨大的模式编译成Java

    有两个主要工具提供了将 XSD 模式编译为 Java 的方法 xmlbeans 和 JAXB 问题是 XSD 模式确实很大 30MB 的 XML 文件 大部分模式在我的项目中没有使用 所以我可以注释掉大部分代码 但这不是一个好的解决方案 目
  • 如何检查某个元素是否存在于一组项目中?

    In an ifJava中的语句如何检查一个对象是否存在于一组项目中 例如 在这种情况下 我需要验证水果是苹果 橙子还是香蕉 if fruitname in APPLE ORANGES GRAPES Do something 这是一件非常微
  • Android 无法解析日期异常

    当尝试解析发送到我的 Android 客户端的日期字符串时 我得到一个无法解析的日期 这是例外 java text ParseException 无法解析的日期 2018 09 18T00 00 00Z 位于 偏移量 19 在 java t
  • Java Applet 中的 Apache FOP - 未找到数据的 ImagePreloader

    我正在研究成熟商业产品中的一个问题 简而言之 我们使用 Apache POI 库的一部分来读取 Word DOC 或 DOCX 文件 并将其转换为 XSL FO 以便我们可以进行标记替换 然后 我们使用嵌入到 Java 程序中的 FOP 将
  • 在Java中运行bat文件并等待

    您可能会认为从 Java 启动 bat 文件是一项简单的任务 但事实并非如此 我有一个 bat 文件 它对从文本文件读取的值循环执行一些 sql 命令 它或多或少是这样的 FOR F x in CD listOfThings txt do
  • 在 Java 中获取并存储子进程的输出

    我正在做一些需要我开始子处理 命令提示符 并在其上执行一些命令的事情 我需要从子进程获取输出并将其存储在文件或字符串中 这是我到目前为止所做的 但它不起作用 public static void main String args try R
  • 为什么\0在java中不同系统中打印不同的输出

    下面的代码在不同的系统中打印不同的输出 String s hello vsrd replace 0 System out println s 当我在我的系统中尝试时 Linux Ubuntu Netbeans 7 1 它打印 When I
  • 将 JScrollPane 添加到 JFrame

    我有一个关于向 Java 框架添加组件的问题 我有一个带有两个按钮的 JPanel 和一个添加了 JTable 的 JScrollPane 我想将这两个添加到 JFrame 中 我可以将 JPanel 添加到 JFrame 或将 JScro
  • Android S8+ 警告消息“不支持当前的显示尺寸设置,可能会出现意外行为”

    我在 Samsung S8 Android 7 中收到此警告消息 APP NAME 不支持当前的显示尺寸设置 可能会 行为出乎意料 它意味着什么以及如何删除它 谢谢 通过添加解决supports screens 机器人 xlargeScre
  • Hibernate 本机查询 - char(3) 列

    我在 Oracle 中有一个表 其中列 SC CUR CODE 是 CHAR 3 当我做 Query q2 em createNativeQuery select sc cur code sc amount from sector cost
  • 列表过滤器内的 Java 8 lambda 列表

    示例 JSON id 1 products id 333 status Active id 222 status Inactive id 111 status Active id 2 products id 6 status Active
  • 在java中以原子方式获取多个锁

    我有以下代码 注意 为了可读性 我尽可能简化了代码 如果我忘记了任何关键部分 请告诉我 public class User private Relations relations public User relations new Rela
  • partitioningBy 必须生成一个包含 true 和 false 条目的映射吗?

    The 分区依据 https docs oracle com javase 8 docs api java util stream Collectors html partitioningBy java util function Pred
  • Java RMI - 客户端超时

    我正在使用 Java RMI 构建分布式系统 它必须支持服务器丢失 如果我的客户端使用 RMI 连接到服务器 如果该服务器出现故障 例如电缆问题 我的客户端应该会收到异常 以便它可以连接到其他服务器 但是当服务器出现故障时 我的客户端什么也
  • Java 11 - 将 Spring @PostConstruct 替换为 afterPropertiesSet 或使用 initMethod

    我正在使用 spring 应用程序 有时会使用 PostConstruct用于代码和测试中的设置 看来注释将被排除在外Java 11 https www baeldung com spring postconstruct predestro

随机推荐

  • 取两个可为空值中的较大者

    假设我有两个可为空的整数 int a 10 int b 20 我想取最大的非空值 这样如果两个值都为空 则结果为空 我可以写一些冗长的东西 例如 int max if a null max b else if b null max a el
  • 控制器规范中的 RSpec 存根辅助方法

    发现类似的问题 但令人惊讶的是 我发现没有一个给出简单的答案 尝试在我的控制器规范中存根辅助方法 不太确定哪个对象需要加倍 控制器调用此方法 app helpers sessions helper rb def signed in curr
  • 在 Java 中将 XML 作为字符串读取

    有人可以帮我解决这个问题吗 我想知道如何将这个示例读取为字符串 我知道如何阅读第一个 但不知道如何阅读所有内容 tr tr
  • 如何声明具有多个具有非平凡关系的泛型类型的成员?

    这是我想在我的java代码中编写的内容 private a R extends Result gt MyType a
  • TlbImp.exe 无法注册 lib 文件:“.dll 不是有效的类型库”

    该 dll是FKAtend dll 附带生物识别设备的VB6 0 SDK 该 dll在VB6 0环境下工作正常 但是 当尝试在另一台具有 VS NET 环境的 PC 上注册它时 出现上述错误 我们使用 dependency walker 检
  • 通过在 MATLAB 中计算平均值进行下采样

    假设我有一个包含 44100 个样本的文件 采样频率为 fs 44100 Hz 所以我的文件是 1 秒长 我想将其下采样到 8 Hz 的采样频率 但我不想通过获取每个 44100 8 5512 5 样本并将其保存在新数组中来实现此目的 但通
  • 构建无法从 VisualStudio 运行,但可以从 msbuild 运行

    从 Visual Studio 中的全新控制台应用程序模板中 我编辑了 csproj构建另一个这样的项目
  • 单选按钮多项选择

    我有许多具有不同名称属性的单选按钮 我面临一个问题 每次我单击每个单选按钮时 我都可以选择全部 我正在使用单选按钮重定向到其他页面 我不想只选择一项 我正在使用 twitter bootstrap 选项卡在一页上显示多个内容 只需切换选项卡
  • 未捕获对象错误:无法注入 ngAnimate

    当我尝试像这样注入 ngAnimate 时 我无法实例化我的应用程序 var app angular module musicsa ngCookies ngResource ngSanitize ui router firebase ngA
  • 基本日期之间查询 $gte、$lte 等

    我在 mongo 查询的正确时间格式方面遇到问题 我的问题是 Is time Timemongo ISODate 对象的正确 go 类型 为什么我的时间解析似乎解析完全不同的日期 这是我正在做的事情的完整示例 package main im
  • 如何使用 ngrok 托管 HTML 文件?

    是否可以使用 NGROK 托管 HTML 文件 而不是 Web 应用程序 我真的对 NGROK 一无所知 我只是用它来托管 Twilio 应用程序的服务器 并且想用它来托管我的另一个项目的 HTML 文件 另外 有人知道如何在 Mac 上创
  • CSS 转换在 IE 中不起作用

    我无法在 IE 或 Firefox 中实现此转换 但在 Safari 和 Chrome 中看起来不错 不透明度显示但是即时的 对我来说 下面的 CSS 看起来是正确的 但我看不出它有任何理由可以在 IE 或 Firefox 中工作 我已经使
  • 我在编译时遇到找不到符号错误

    import java io File import java io BufferedReader import java io InputStreamReader import java io import java io InputSt
  • 如何通过 URL 访问 Jenkins 在 lastSuccessfulBuild 中创建的工件?

    我正在使用 Jenkins 管道构建 Android 应用程序 构建成功完成后 它会创建一个 apk 文件 我希望 QA 团队的成员能够下载此文件并在将其上传到 Google 商店之前测试该应用程序 因此我希望这些用户 有权访问 Jenki
  • 将项目添加到不可变的 Seq

    假设我有一个字符串序列作为输入 我想获得一个新的不可变的Seq它由输入的元素和一个项目组成 c 以下是我发现有效的两种方法 assert Seq a b c Seq a b Seq c 这个的问题是 似乎实例化了一个临时序列 Seq c 只
  • tkinter:无法进入条目小部件

    我不明白为什么下面的输入框rackGUI py在我的代码中是静态的 不允许输入任何内容 我相信所有的Entry对象被正确实例化 我将文本变量指定为StringVar 我的直觉告诉我问题在于命令参数create button实例化 但我不太确
  • Jsoup 未下载整个页面

    网页是 http www hkex com hk eng market sec tradinfo stockcode eisdeqty pf htm http www hkex com hk eng market sec tradinfo
  • IdentityServer4分别对每个客户端进行身份验证

    我使用两个不同的客户端 IdentityServer4提供API保护和登录表单 我可以配置客户端以避免单点登录吗 我的意思是 即使我登录了第一个客户端 我也需要登录第二个客户端 我的ID4配置 internal static IEnumer
  • Highcharts 进度条形图

    是否可以在 Highcharts 中创建这样的进度图表 https 0 s3 envato com files 84221450 screenshots weblator responsive charts 7 bootstrap jpg
  • Jackson->Jackson + HttpPost =“无效的UTF-8中间字节”,设置Mime和编码

    我在我的客户端中使用 Apache HTTP 客户端库和 Jackson 当我将 JSON 发布到服务器时 出现错误 org codehaus jackson JsonParseException Invalid UTF 8 middle