我正在尝试使用 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 NGnPPOST /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/