当前位置: 首页 > 知识库问答 >
问题:

android中http调用的字符串格式问题-索引81处查询中的非法字符

陶淳
2023-03-14

在我的应用程序中,我必须根据用户选择的类型和子类型从JSON服务中获取数据,并将数据显示给用户。

http://abc.abc.ab.abc/myappnameapiii/index.php/Api/getAllInfoctoryUser_type?data={"type":"TYP","sub_type":"SUB"}

示例代码:

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\"}

以下是我试图解决这个问题的方法:

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"}

代码段:

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
    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);
    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请求中正确地传递参数吗?

共有1个答案

刘京
2023-03-14

使用Urlencoder对URL参数字符串进行编码。

对您的typeinfo及其前面的{进行编码。

 类似资料:
  • 我正在做的:我试图在android中做一个反向地理编码 这一行给出了这个错误:: jsonFunctions.java

  • 我认为索引146处字符是''。那个角色怎么了? 谢谢你的建议。 这是我构建查询的代码:

  • 问题内容: 我在做什么: 我正在尝试在android中进行反向地理编码 我收到以下错误消息: java.lang.IllegalArgumentException:索引59处的查询中的非法字符:http : //maps.google.com/maps/api/geocode/json? address= Agram,Bengaluru,卡纳塔克邦,印度&sensor = false 注意:该请求

  • 问题内容: 我在RAD中收到以下错误: 您能否让我知道错误是什么以及如何解决? 问题答案: 索引16处有一个非法字符。我想说它不喜欢路径中的空格。您可以百分比编码特殊字符,例如空格。在这种情况下,将其替换为%20。 我上面链接的问题建议使用URLEncoder:

  • 我对RegEx-es和类似的搜索模式非常缺乏经验,而且我所尝试的每一种方法都不能正常工作(大多数情况下会导致)。 找到字符串中最后一组数字开始的索引的可靠而简单的方法是什么?

  • 我已经尝试遍历字符串并手动替换它们,但计数是关闭的。我也尝试过使用列表、数组、stringbuilder等,但我无法使其工作: 我觉得必须有一种简单的方法来用子字符串替换字符串中的单个字符,而不必进行所有这些迭代。我说错了吗?