繁体   English   中英

由于字符串格式而在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造成了问题。

网址是这样的:

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

第二:

提到这个问题,我根据帖子上的答案尝试使用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);

在这里,我使用两个String而不是一个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

我对现在该做什么一无所知。 如果有人可以帮助,那就太好了。

PS:相同的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方法的代码在我的其他调用中运行良好。 所以我没有在这里发布所有代码。 得到响应后,该方法的代码段为:

    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及其前面的{

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM