Why does url with space gives me MalformedURLException? [closed]

Tags: , , , ,



I work with GoogleBook API, when i type one word on EditText, URL link works well for example: I type prince and the app doesn’t crash, but when i type the prince it crashes and give me MalformedURLException : no protocol.

I have searched on Stackoverflow, then i found 2 solutions and nothing solved my problem.

  • First Solution:
   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();
    }

returned value: 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 (there is %20 between the and prince)

The first If statement above that check if the string contains whitespace didn’t solve my problem, i get the same exception.

  • Second Solution:
    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();
    }

returned value: 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 (there is + between the and prince)

I pass that value to this method: (The exception occur here)

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

Important Update: I typed another word (this: the price) and the app worked well, the problem with some words

Thanks in advance

Answer

Thanks to everyone, the problem was in StringBuilder itself at makeURL(), i replaced it with String then everything worked without any exceptions. makeURL() after editing:

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


Source: stackoverflow