java - okhttp 不需要的表单数据转义

标签 java json okhttp

我正在尝试使用 okhttp 构建一个 post 请求以将 JSON 发送到现有服务。但是当我尝试发送表单时,okhttp 会转义 JSON 中的所有特殊字符 - 但服务器被编码为仅接受未转义的字符。

String msg = "{SomeJsonMsg:...}";
FormEncodingBuilder b = new FormEncodingBuilder();
b.addEncoded( msg, "" );
RequestBody form_body = b.build();

使用wireshark,它会显示我尝试重新编码的应用程序的以下内容(即良好的调用):

D=E@d+2JPe NGnPPOST /pp/httpService.do HTTP/1.1
User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.4.2; GT-I9500 Build/KOT49H)
Host: test.com
Connection: Keep-Alive
Accept-Encoding: gzip
Content-Type: application/x-www-form-urlencoded
Content-Length: 213

{"callPara": {"userPassword":"password!","userName":"myname","gameName":"SGZJ-ANDROID-SG","udid":"d5d96bcc3a8e436ab991d35eb284d6bd","clientType":"EN","releaseChannel":"EN","locale":"EN"},"serviceName":"login"}

但是上面的java代码转储了这个(一个错误的调用):

D=Ev@+2J,P  ^FPPOST /pp/httpService.do HTTP/1.1
User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.4.2; GT-I9500 Build/KOT49H
Content-Type: application/x-www-form-urlencoded
Content-Length: 324
Host: test.com
Connection: Keep-Alive
Accept-Encoding: gzip

%7B%22callPara%22%3A%7B%22userPassword%22%3A%22password%21%22%2C%22userName%22%3A%22myname%22%2C%22gameName%22%3A%22SGZJ-ANDROID-SG%22%2C%22udid%22%3A%226d49ee067762822c6a8f721d256ce44c%22%2C%22clientType%22%3A%22EN%22%2C%22releaseChannel%22%3A%22EN%22%2C%22locale%22%3A%22EN%22%7D%2C%22serviceName%22%3A%22login%22%7D=

有没有办法使用 okhttp 来做到这一点?我尝试过 b.add( msg, "") 和 b.addEncoded( msg, "") - 无法真正区分两者之间的区别,java 文档也没有说明这两个调用的任何内容。

最佳答案

您正在使用 HTML 表单编码,但需要常规 HTTP 请求正文。

替换这个:

FormEncodingBuilder b = new FormEncodingBuilder();
b.addEncoded( msg, "" );
RequestBody form_body = b.build();

这样:

MediaType JSON = MediaType.parse("application/json; charset=utf-8");
RequestBody body = RequestBody.create(JSON, msg); 

关于java - okhttp 不需要的表单数据转义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40669128/

相关文章:

android - 将 JWT 身份验证 token 添加到 OkHttp、Dagger 2 和 Retrofit

android - 无法在 OkHttp3 : Level has private access and SetLevel is deprecated 中设置级别

java - 如何打印树中大于特定节点的所有节点?

java - 实现和运行Here API的问题

jquery - 使用 jQuery 将 JSON 数组转换为 HTML 项目符号列表

javascript - 无法删除具有空值的 JSON 项目

android - java.net.协议(protocol)异常 : unexpected end of stream

java - 如何在数据库表中查询仅包含两个数据对象的记录列表

java - java中数据字段的初始化顺序

c# - 将xml树转换为json树