为什么带有空格的url给我MalformedURLException?

问题描述

我使用GoogleBook API,当我在EditText上键入一个单词时,URL链接运行良好,例如: 我键入王子,应用不会崩溃,但是当我键入王子时,它崩溃了,并给了我 MalformedURLException:没有协议。>

我在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;
    }

重要更新:我输入了另一个词(此词:价格),应用运行良好,出现了一些词问题

预先感谢

解决方法

据我了解查询字符串的URL编码,用%20替换空格可行,但用+替换失败。

两个人都应该使用AFAIK。线长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();
    }

因此,问题一定是混淆的错误代码。

,

谢谢大家,问题出在StringURL本身的makeURL()上,我用String替换了它,然后一切正常,没有任何异常。 编辑后的makeURL():

/