Android:Uri编码地名的神秘逃脱单引号

时间:2017-06-18 14:14:33

标签: android url httpurlconnection urlencode

我正在使用PlaceAutocomplete来获取地名,然后我将其编码并作为GET请求的一部分(在网址中)发送到远程主机。

在远程主机上,我发现有些用户设备正在发送被转义的单引号,这会导致问题,因为地名是作为URL的一部分发送的。

e.g。 “Andy's Place”正在发送为“Andy\'s Place

并且出于显而易见的原因,部分网址时出现反斜杠\

...但主要是,此不会发生 ...在我自己的测试设备上它没有...这个地方被发送/接收为“Andy's Place”。

我正试图从头到尾检查链条,看看意外逃逸可能发生在哪里。我试图总结下面的链,遗漏了一些东西(例如我不发送placeName,我也发送其他东西)...我希望我'包括所有重要的部分:

Place place = PlaceAutocomplete.getPlace(this, data);
String placeName = (String) place.getName();
EditText_placeName.setText(placeName);
// ... later ...
String newPlaceName = EditText_placeName.getText().toString();
String encodedPlaceName = Uri.encode(newPlaceName);
URL url = new URL(strBaseURL + '/' + encodedPlaceName);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
responseCode = connection.getResponseCode();

上述链中是否有任何内容可能会在部分设备上的网址中引入不需要的转义字符而不会引入其他设备?

作为一种脚注,我知道通过POST(在正文中)而不是GET(作为URL的一部分)发送数据可能会更好(可能会解决我的问题)完全问题),这确实是我现在正朝着这个方向发展的,但我仍然想知道\角色是如何通过上述链条的,至少部分是出于好奇。

1 个答案:

答案 0 :(得分:5)

好的,我明白了,"问题"实际上发生之后我原来的帖子中提到的处理链。我会详细说明实际发生的事情,以防它在这种情况下帮助其他任何人。

\'实际上是由于在node.js应用程序中记录字符串的方式而出现的。每当在node.js应用程序中发生超时时(仅偶尔发生,并且结果与\'问题无关),我停止处理并返回错误。

出于诊断目的,我将导致超时的URL添加到Error对象(我自己创建的对象或已存在的对象),以便我可以再次访问该URL以尝试重新创建问题并查看可能导致超时的原因。

类似于:

var err = new Error('oh dear');
err.recreate = theURLString; // the URL for the request that led to the problem
console.log(err);

实际上,当我将此err记录到控制台(如上所述)时, 是在引入\'时...即任何{{1 '中的字符变为theURLString

所以我想它必须是\'对象的.toString()实现。当我执行以下操作时:

Error

... console.log(JSON.stringify(err)); 序列出现。

甚至只是原始网址字符串:

\'

所以,问题(例如它)只是在记录阶段,而不是之前。并且,每个请求在网址中都有console.log(theURLString); 并不会发生这种情况,原因不是每个'的请求都导致超时(通常问题只是过载了)资源)。以前所有的东西都让我偏离了轨道。