我尝试使用普通字符串向wifi控制器发送HTTP请求。我的字符串是API:W/PSS:12345
但是当通过我的Android应用程序发送时,控制器会收到API=W%2FPSS%3A12345
。我知道这是由于标头值content-type: application/x-www-form-urlencoded
而发生的。
但是,在我的请求中,我已经覆盖了该方法:
public String getBodyContentType() {
return "text/html;";
}
将内容类型设置为纯文本,但是在发送之前,volley仍会对其进行编码。 (在我的PC上使用REST客户端,将请求发送到控制器而不对其进行编码)
有没有办法将我的字符串作为纯文本发送而不进行凌空编码?控制器是低级别的,所以我不想在两侧添加任何编码,只需发送普通字符串。
答案 0 :(得分:0)
也覆盖getHeaders方法,并在标题中设置内容类型,如下所示:
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/text");
return headers;
}
答案 1 :(得分:0)
在挖掘了凌空源代码之后,我发现罪魁祸首是调用了一个java URLEncoder.encode()
方法,它将对字符串进行编码,无论如何...我以非常黑客的方式跳过这个。如果你们中有人有更好的方法,请告诉我,因为这非常难看:
@Override
public String getBodyContentType() {
//for settings the content=type header, the right way...
return return "text/html";
}
@Override
public byte[] getBody() throws AuthFailureError {
Map<String, String> params = getParams();
if (params != null && params.size() > 0) {
return encodeParameters(params, getParamsEncoding());
}
return null;
}
//Hax.......
private byte[] encodeParameters(Map<String, String> params, String paramsEncoding){
StringBuilder encodedParams = new StringBuilder();
try {
for (Map.Entry<String, String> entry : params.entrySet()) {
encodedParams.append(entry.getKey());
//encodedParams.append(':');
encodedParams.append(entry.
//encodedParams.append('&');
}
return encodedParams.toString().getBytes(paramsEncoding);
} catch (UnsupportedEncodingException uee) {
throw new RuntimeException("Encoding not supported: " + paramsEncoding, uee);
}
}
凌空的源代码在这里,你可以看看它如何编码项目:https://android.googlesource.com/platform/frameworks/volley/+/idea133/src/com/android/volley/Request.java