由于字符串格式,在 android 中进行 http 调用时出现问题 - 索引 81 处查询中的非法字符
Issue in making http call in android due to String format - illegal character in query at index 81
在我的应用程序中,我必须根据用户选择的 TYPE 和 SUB TYPE 从 JSON 服务获取数据并将数据显示给用户。
我知道如何发出 http 请求,如何解析响应,但是 URL 造成了问题。
URL是这样的:
http://abc.abc.ab.abc/myappnameapiii/index.php/Api/getAllInfoctoryUser_type?data={"type":"TYP","sub_type":"SUB"}
我尝试用 StringEscapeUtils
转义 "
。但这并没有帮助。
示例代码:
String baseUrl = "http://abc.abc.ab.abc/myappnameapiii/index.php/Api/getAllInfoctoryUser_type?data={";
String typeInfo = "\"type\":\""+selectedType+"\",\"sub_type\":\""+selectedSubType+"\"}";
typeInfo = StringEscapeUtils.escapeJava(typeInfo);
String finalUrl = baseUrl + typeInfo;
//Call asynctask using finalUrl
....
....
我在发出 http 请求时遇到此异常:
java.lang.IllegalArgumentException: Illegal character in query at index 81: http://abc.abc.ab.abc/myappnameapiii/index.php/Api/getAllInfoctoryUser_type?data={\"type\":\"TYP\",\"sub_type\":\"SUB\"}
以下是我尝试解决此问题的方法:
第一个:
在我像这样在 AsyncTask 中进行调用之前,我尝试取消转义 typeInfo
:
try {
String finalUrl = baseUrl.concat(typeInfo);*/
String finalUrl = StringEscapeUtils.unescapeJava(url[0]);
object = RestJsonClient.connect(finalUrl);
} catch (Exception e) {
e.printStackTrace();
}
这没有帮助。它抛出异常为:
java.lang.IllegalArgumentException: Illegal character in query at index 81: http://abc.abc.ab.abc/myappnameapiii/index.php/Api/getAllInfoctoryUser_type?data={"type":"TYP","sub_type":"SUB"}
第二个:
参考 this question 我根据 post.
的回答尝试使用 UTF-8 编码
代码片段:
String baseUrl = url[0];
String typeInfo = URLEncoder.encode(url[1], "UTF-8");
String finalUrl = baseUrl.concat(typeInfo);
//String finalUrl = StringEscapeUtils.unescapeJava(url[0]);
object = RestJsonClient.connect(finalUrl);
这里,我用两个字符串而不是一个 finalUrl 字符串将 URL 传递给 asynctask。
这也会引发异常,例如:
java.lang.IllegalArgumentException: Illegal character in query at index 81: http://abc.abc.ab.abc/myappnameapiii/index.php/Api/getAllInfoctoryUser_type?data={%5C%22type%5C%22%3A%5C%22MANUFACTURER%5C%22%2C%5C%22sub_type%5C%22%3A%5C%22GOLD%5C%22%7D
我现在不知道该怎么办。如果有人能提供帮助就太好了。
P.S:同样url在浏览器中显示结果。 url 正确,数据在服务器上。
编辑
根据@Tejas 的评论,我尝试将数据传递到 POST 请求的正文中,如下所示:
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("type", "TYP"));
params.add(new BasicNameValuePair("sub_type", "SUB"));
//request.setEntity(new UrlEncodedFormEntity(params));
object = RestJsonClient.post( baseUrl, params);
RestJsonClient.post
方法的代码在我的其他调用中工作正常。因此,我不会 post 处理此处的所有代码。我得到响应后该方法的片段是:
HttpEntity httpentity = response.getEntity();
if (httpentity != null) {
InputStream instream = httpentity.getContent();
String result = convertStreamToString(instream);
System.out.println("result: " + result);
json = new JSONObject(result);
instream.close();
}
现在没有错误了。我从服务收到状态代码为 OK (200) 的响应。但是结果没有数据。
08-10 10:33:42.141 7003-9831/jbc.gss.com.jewelnet I/System.out: response in restjson claas- org.apache.http.message.BasicHttpResponse@27ee4f83
08-10 10:33:42.141 7003-9831/pkg.name V/response code: 200
08-10 10:33:42.142 7003-9831/pkg.name I/System.out: result: {"response":"failure","message":" Not data available"}
08-10 10:33:42.150 7003-7003/pkg.name W/System.err: org.json.JSONException: No value for data
如果需要,我无法请求更改服务。谁能帮我在 GET 请求中正确传递参数?
使用 URLEncoder
对您的 URL 参数字符串进行编码。
编码你的 typeInfo
和它前面的 {
。
在我的应用程序中,我必须根据用户选择的 TYPE 和 SUB TYPE 从 JSON 服务获取数据并将数据显示给用户。
我知道如何发出 http 请求,如何解析响应,但是 URL 造成了问题。
URL是这样的:
http://abc.abc.ab.abc/myappnameapiii/index.php/Api/getAllInfoctoryUser_type?data={"type":"TYP","sub_type":"SUB"}
我尝试用 StringEscapeUtils
转义 "
。但这并没有帮助。
示例代码:
String baseUrl = "http://abc.abc.ab.abc/myappnameapiii/index.php/Api/getAllInfoctoryUser_type?data={";
String typeInfo = "\"type\":\""+selectedType+"\",\"sub_type\":\""+selectedSubType+"\"}";
typeInfo = StringEscapeUtils.escapeJava(typeInfo);
String finalUrl = baseUrl + typeInfo;
//Call asynctask using finalUrl
....
....
我在发出 http 请求时遇到此异常:
java.lang.IllegalArgumentException: Illegal character in query at index 81: http://abc.abc.ab.abc/myappnameapiii/index.php/Api/getAllInfoctoryUser_type?data={\"type\":\"TYP\",\"sub_type\":\"SUB\"}
以下是我尝试解决此问题的方法:
第一个:
在我像这样在 AsyncTask 中进行调用之前,我尝试取消转义 typeInfo
:
try {
String finalUrl = baseUrl.concat(typeInfo);*/
String finalUrl = StringEscapeUtils.unescapeJava(url[0]);
object = RestJsonClient.connect(finalUrl);
} catch (Exception e) {
e.printStackTrace();
}
这没有帮助。它抛出异常为:
java.lang.IllegalArgumentException: Illegal character in query at index 81: http://abc.abc.ab.abc/myappnameapiii/index.php/Api/getAllInfoctoryUser_type?data={"type":"TYP","sub_type":"SUB"}
第二个:
参考 this question 我根据 post.
的回答尝试使用 UTF-8 编码代码片段:
String baseUrl = url[0];
String typeInfo = URLEncoder.encode(url[1], "UTF-8");
String finalUrl = baseUrl.concat(typeInfo);
//String finalUrl = StringEscapeUtils.unescapeJava(url[0]);
object = RestJsonClient.connect(finalUrl);
这里,我用两个字符串而不是一个 finalUrl 字符串将 URL 传递给 asynctask。
这也会引发异常,例如:
java.lang.IllegalArgumentException: Illegal character in query at index 81: http://abc.abc.ab.abc/myappnameapiii/index.php/Api/getAllInfoctoryUser_type?data={%5C%22type%5C%22%3A%5C%22MANUFACTURER%5C%22%2C%5C%22sub_type%5C%22%3A%5C%22GOLD%5C%22%7D
我现在不知道该怎么办。如果有人能提供帮助就太好了。
P.S:同样url在浏览器中显示结果。 url 正确,数据在服务器上。
编辑
根据@Tejas 的评论,我尝试将数据传递到 POST 请求的正文中,如下所示:
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("type", "TYP"));
params.add(new BasicNameValuePair("sub_type", "SUB"));
//request.setEntity(new UrlEncodedFormEntity(params));
object = RestJsonClient.post( baseUrl, params);
RestJsonClient.post
方法的代码在我的其他调用中工作正常。因此,我不会 post 处理此处的所有代码。我得到响应后该方法的片段是:
HttpEntity httpentity = response.getEntity();
if (httpentity != null) {
InputStream instream = httpentity.getContent();
String result = convertStreamToString(instream);
System.out.println("result: " + result);
json = new JSONObject(result);
instream.close();
}
现在没有错误了。我从服务收到状态代码为 OK (200) 的响应。但是结果没有数据。
08-10 10:33:42.141 7003-9831/jbc.gss.com.jewelnet I/System.out: response in restjson claas- org.apache.http.message.BasicHttpResponse@27ee4f83
08-10 10:33:42.141 7003-9831/pkg.name V/response code: 200
08-10 10:33:42.142 7003-9831/pkg.name I/System.out: result: {"response":"failure","message":" Not data available"}
08-10 10:33:42.150 7003-7003/pkg.name W/System.err: org.json.JSONException: No value for data
如果需要,我无法请求更改服务。谁能帮我在 GET 请求中正确传递参数?
使用 URLEncoder
对您的 URL 参数字符串进行编码。
编码你的 typeInfo
和它前面的 {
。