为什么我需要url encode =?

时间:2014-12-04 00:17:05

标签: java urlencode url-encoding

我需要处理传递给我们库的任何给定网址。所以起初我做了:

        URL url = new URL(filename);
        URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
        url = new URL(uri.toASCIIString());
        URLConnection conn = url.openConnection();

对于网址http://www.stackoverflow.com?title =Člen8FO,这给了我一个http://www.stackoverflow.com?title=%C4%8Clen8FO的网址

当我提出请求时,它返回了403。所以我做了:

        URL url = new URL(filename);
        URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), URLEncoder.encode(url.getQuery(), "UTF-8"), url.getRef());
        url = new URL(uri.toASCIIString());

这给了我一个http://www.stackoverflow.com?title%3D%C4%8Clen8FO

的网址

为什么它在显式=失败?我认为这完全有效。

更新:这太奇怪了。以下代码失败,现在成功了。

import java.io.InputStream;
import java.net.*;

public class UriIssue {

    public static void main(String[] args) {

        try {
            openUriWithEncode("http://www.google.com/?q=\u010clen8FO");
            System.out.println("completed successfully");
        } catch (Exception ex) {
            System.out.println("exception = " + ex);
        }

        try {
            openUriNoEncode("http://www.google.com/?q=\u010clen8FO");
            System.out.println("completed successfully");
        } catch (Exception ex) {
            System.out.println("exception = " + ex);
        }

    }

    public static void openUriWithEncode(String fullUrl) throws Exception {

        System.out.println("openUriWithEncode(" + fullUrl + ")");
        URL url = new URL(fullUrl);
        String query = url.getQuery() != null ? URLEncoder.encode(url.getQuery(), "UTF-8") : null;
        URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), query, url.getRef());
        System.out.println("uri = " + uri.toASCIIString());
        url = new URL(uri.toASCIIString());
        URLConnection conn = url.openConnection();
        InputStream stream = conn.getInputStream();
        stream.close();
    }

    public static void openUriNoEncode(String fullUrl) throws Exception {

        System.out.println("openUriNoEncode(" + fullUrl + ")");
        URL url = new URL(fullUrl);
        URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
        System.out.println("uri = " + uri.toASCIIString());
        url = new URL(uri.toASCIIString());
        URLConnection conn = url.openConnection();
        InputStream stream = conn.getInputStream();
        stream.close();
    }
}

1 个答案:

答案 0 :(得分:1)

您正在对整个查询进行编码,包括=,因此=当然正在编码。您只需要对键和值进行编码,例如

URLEncoder.encode(key)+"="+URLEncoder.encode(value)