gpt4 book ai didi

java - 为什么需要对=进行url编码?

转载 作者:太空宇宙 更新时间:2023-11-04 06:22:15 27 4
gpt4 key购买 nike

我需要处理传递给我们库的任何给定网址。所以一开始我是这样做的:

        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 这给了我一个 url 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();
}
}

最佳答案

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

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

关于java - 为什么需要对=进行url编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27284131/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com