java - DataOutputStream 和 OutputStreamWriter 之间的区别:字符串兼容性?
问题描述
我对 Java 很陌生,但是在将 OutputStreamWriter 和 DataOutputStream 与 HttpUrlConnection 的 POST 请求一起使用时,我得到了不同的结果。
我可以在使用 DataOutputStream 时附加参数。
URL url = new URL("https://www.google-analytics.com/debug/collect");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;");
conn.setRequestMethod("POST");
String parameters = "v=1&tid=UA-62749954-12&cid=test.clientid.456&t=event&ec=offline_cv&ea=register";
DataOutputStream writer = new DataOutputStream(conn.getOutputStream());
writer.writeBytes(parameters);
writer.close();
conn.connect();
回复:
{ "hitParsingResult": [ { "valid": true, "parserMessage": [ ], "hit": "/debug/collect?v=1\u0026tid=UA-62749954-12\u0026cid=test.clientid.456\u0026t=event\u0026ec=offline_cv\u0026ea=register" } ], "parserMessage": [ { "messageType": "INFO", "description": "Found 1 hit in the request." } ]}
但是,在使用 OutputStreamWriter 时我不能附加参数。
OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
writer.write(URLEncoder.encode(parameters, "UTF-8"));
回复:
{ "hitParsingResult": [ { "valid": false, "parserMessage": [ { "messageType": "ERROR", "description": "A value is required for parameter 'v'. Please see https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#v for details.", "messageCode": "VALUE_REQUIRED", "parameter": "v" } ], "hit": "/debug/collect" } ], "parserMessage": [ { "messageType": "INFO", "description": "Found 1 hit in the request." } ]}
是不是因为DataOutputStream兼容String,而OutputStreamWriter不兼容?
解决方案
1)问题在这里:
URLEncoder.encode(parameters, "UTF-8")
您的参数已经经过 url 编码。调用此方法会使它们格式错误。
2)使用一些工具来监控HTTP请求,了解请求和响应发生了什么。
推荐阅读
- jquery - 将 jQuery replaceWith 重构为箭头函数的正确方法是什么?
- azure - Azure blob 的 AzureSigningError
- android - Android Q 上已弃用的 WifiManager.getConfiguredNetworks 和 WifiManager.removeNetwork 方法的替代方案?
- javascript - 如何使用反应测试库测试这个组件 - 只是这个新测试库的初学者
- python - Pandas 数据框搜索的一站式解决方案
- ios - CoreData 扩展:在 NSManagedObjectContext 中插入 NSManagedObject
- javascript - 如何避免在反应功能组件中对“静态组件”进行不必要的重新渲染?
- python-3.x - 如何使用“flask-graphql”将资源管理器添加到 GraphiQL?
- mysql - Tkinter 列表中的 Python 菜单
- html - 在日期选择器中设置语言?