为什么带有空格的url会给我错误的格式异常?

gt0wga4j  于 2021-07-04  发布在  Java
关注(0)|答案(2)|浏览(373)

**结束。**此问题不符合堆栈溢出准则。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。

4个月前关门了。
改进这个问题
我使用GoogleBookAPI,当我在edittext上键入一个单词时,url链接工作得很好例如:我键入prince,应用程序不会崩溃,但当我键入prince时,它会崩溃,并给我错误的格式异常:无协议。
我已经搜索了stackoverflow,然后我找到了2个解决方案,但没有解决我的问题。
第一种解决方案:

private String makeUrl(String textFromEditText){
        StringBuilder stringBuilder = new StringBuilder();
        if (textFromEditText.contains(" ")){ // the method replace the space with %20
            textFromEditText = textFromEditText.replace(" ","%20");
        }
        if (textFromEditText != null){
            stringBuilder.append("https://www.googleapis.com/books/v1/volumes?download=DOWNLOAD_UNDEFINED&filter=FILTER_UNDEFINED&libraryRestrict=LIBRARY_RESTRICT_UNDEFINED&maxResults=20&orderBy=relevance&printType=ALL&q=");
            stringBuilder.append(textFromEditText);
            stringBuilder.append("&key=AIzaSyCJmeSLPw147mRSnc2nZNgPSbebtH-RxDc");

        }
        Log.v("makeURL",stringBuilder.toString());
        return stringBuilder.toString();
    }

返回值:https://www.googleapis.com/books/v1/volumes?download=download_undefined&filter=filter_undefined&libraryrestrict=library_restrict_undefined&maxresults=20&orderby=relevance&printtype=all&q=the%20prince&key=aizasycjmeslpw147mrsnc2nzngpsbebth-rxdc (和王子之间有%20)
上面的第一个if语句检查字符串是否包含空格并没有解决我的问题,我得到了同样的异常。
第二种解决方案:

private String makeUrl(String textFromEditText) {
        StringBuilder stringBuilder = new StringBuilder();
        if (textFromEditText != null){
            stringBuilder.append("https://www.googleapis.com/books/v1/volumes?download=DOWNLOAD_UNDEFINED&filter=FILTER_UNDEFINED&libraryRestrict=LIBRARY_RESTRICT_UNDEFINED&maxResults=20&orderBy=relevance&printType=ALL&q=");
            try{
                stringBuilder.append(URLEncoder.encode(textFromEditText,"UTF-8"));
Here i used URL encoder
            }catch (UnsupportedEncodingException io){}
            stringBuilder.append("&key=AIzaSyCJmeSLPw147mRSnc2nZNgPSbebtH-RxDc");

        }
        Log.v("makeURL",stringBuilder.toString());
        return stringBuilder.toString();
    }

返回值:https://www.googleapis.com/books/v1/volumes?download=download_undefined&filter=filter_undefined&libraryrestrict=library_restrict_undefined&maxresults=20&orderby=relevance&printtype=all&q=the+prince&key=aizasycjmeslpw147mrsnc2nzngpsbebth-rxdc (和王子之间有+)
我将该值传递给这个方法:(这里发生异常)

private static URL createURL(String link) {
        URL url = null;
        try{
            url = new URL(link);
        }catch (MalformedURLException mal){
            mal.printStackTrace();
        }
        return url;
    }

重要更新:我输入了另一个字(这个:价格)和应用程序运行良好,一些字的问题
提前谢谢

qncylg1j

qncylg1j1#

我理解了查询字符串的url编码,用 %20 有效,但替换为 + 失败。
两个人都应该好好工作。行长度241很高,但比%20高。
它编译并与我一起运行:

try {
        URL url = new URL("https://www.googleapis.com/books/v1/volumes?download=DOWNLOAD_UNDEFINED"
                + "&filter=FILTER_UNDEFINED&libraryRestrict=LIBRARY_RESTRICT_UNDEFINED"
                + "&maxResults=20&orderBy=relevance&printType=ALL&q="
                + URLEncoder.encode("the prince","UTF-8")
                + "&key=AIzaSyCJmeSLPw147mRSnc2nZNgPSbebtH-RxDc");
        System.out.println(url);
    } catch (MalformedURLException | UnsupportedEncodingException e) {
        e.printStackTrace();
    }

所以问题一定是混淆了,错误的代码。

tkqqtvp1

tkqqtvp12#

感谢大家,问题出在makeurl()的stringbuilder本身,我用string替换了它,然后一切正常。编辑后生成URL():

private String makeUrl(String textFromEditText) {
        String oldLink = textFromEditText;
            textFromEditText="https://www.googleapis.com/books/v1/volumes?download=DOWNLOAD_UNDEFINED&filter=FILTER_UNDEFINED&libraryRestrict=LIBRARY_RESTRICT_UNDEFINED&maxResults=20&orderBy=relevance&printType=ALL&q=";
            textFromEditText+=URLEncoder.encode(oldLink);
            textFromEditText+="&key=AIzaSyCJmeSLPw147mRSnc2nZNgPSbebtH-RxDc";
        Log.v("makeURL",stringBuilder.toString());
        return textFromEditText;
}

相关问题