Java 在http post的URL中编码参数和值还是仅编码值?

Java 在http post的URL中编码参数和值还是仅编码值?,java,urlencode,Java,Urlencode,我有一个提交http post请求的Java类。我有查询参数,我的问题是我需要编码名称=值对还是只编码值 String query = "foo=abc&bar=efg"; String encodedQuery = URLEncoder.encode("foo=abc&bar=efg","utf-8"); 或 您应该始终对整个URL进行编码。因此,为了回答您的问题,您应该对整个查询进行编码 事实上,一种更简单的编码方式是使用URI构建完整的URL。因此,使用查询变量 URI

我有一个提交http post请求的Java类。我有查询参数,我的问题是我需要编码名称=值对还是只编码值

String query = "foo=abc&bar=efg";

String encodedQuery = URLEncoder.encode("foo=abc&bar=efg","utf-8");


您应该始终对整个URL进行编码。因此,为了回答您的问题,您应该对整个查询进行编码

事实上,一种更简单的编码方式是使用URI构建完整的URL。因此,使用
查询
变量

URI uri = new URI(
    "http", 
    "example.com", 
    "/path",
    query,
    null);

URL url = uri.toURL();
// ... then open the HttpURLConnection

请注意,上述代码没有对非ASCII字符执行适当的转义序列

您应该始终对整个URL进行编码。因此,为了回答您的问题,您应该对整个查询进行编码

事实上,一种更简单的编码方式是使用URI构建完整的URL。因此,使用
查询
变量

URI uri = new URI(
    "http", 
    "example.com", 
    "/path",
    query,
    null);

URL url = uri.toURL();
// ... then open the HttpURLConnection

请注意,上述代码没有对非ASCII字符执行适当的转义序列。调用encode以确保URI中没有不安全的字符。不安全字符几乎是每一个不是字母、数字和某些特殊字符的字符

从URLEncoder的java文档

字母数字字符“a”到“z”、“a”到“z”和“0”到>“9”保持不变。 特殊字符“.”、“-”和“*”保持不变。 空格字符“”被转换为加号“+”。 所有其他字符都是不安全的,首先使用某种编码方案转换为一个或多个字节>。然后每个字节由3个字符>字符串“%xy”表示,其中xy是字节的两位十六进制表示形式。>建议使用的编码方案是UTF-8。但是,出于兼容性>原因,如果未指定编码,则使用>平台的默认编码

例如:

String query = "foo=abc&bar=def";
所以。如果对整个查询进行编码,将导致

foo%3Dabc%26bar%3Defg
在本例中,您还对=和&进行了编码,这是分隔查询部分所需的

您必须对查询的名称和值进行编码,以确保它们不包含不安全的字符。e、 g.&,=和任何不可打印/特殊字符。如果您知道,您的名称只包含安全字符,则不必对名称进行编码

String param1 = URLEncoder.encode("abc", "utf-8");
String param2 = URLEncoder.encode("a&b", "utf-8");
String query = "foo=" + param1 + "&bar=" + param2;
导致

foo=abc&bar=a%26b

这应该是您需要的查询。请注意&in-param2将被编码,因为它对于有效的url是“不安全的”

调用URLEncoder.encode以确保URI中没有不安全的字符。不安全字符几乎是每一个不是字母、数字和某些特殊字符的字符

从URLEncoder的java文档

字母数字字符“a”到“z”、“a”到“z”和“0”到>“9”保持不变。 特殊字符“.”、“-”和“*”保持不变。 空格字符“”被转换为加号“+”。 所有其他字符都是不安全的,首先使用某种编码方案转换为一个或多个字节>。然后每个字节由3个字符>字符串“%xy”表示,其中xy是字节的两位十六进制表示形式。>建议使用的编码方案是UTF-8。但是,出于兼容性>原因,如果未指定编码,则使用>平台的默认编码

例如:

String query = "foo=abc&bar=def";
所以。如果对整个查询进行编码,将导致

foo%3Dabc%26bar%3Defg
在本例中,您还对=和&进行了编码,这是分隔查询部分所需的

您必须对查询的名称和值进行编码,以确保它们不包含不安全的字符。e、 g.&,=和任何不可打印/特殊字符。如果您知道,您的名称只包含安全字符,则不必对名称进行编码

String param1 = URLEncoder.encode("abc", "utf-8");
String param2 = URLEncoder.encode("a&b", "utf-8");
String query = "foo=" + param1 + "&bar=" + param2;
导致

foo=abc&bar=a%26b

这应该是您需要的查询。请注意&in-param2将被编码,因为它对于有效的url是“不安全的”

对。我没有包含完整的代码,但使用HttpUrlConnectionAPI处理http post请求。是的。我没有包括全部代码,但使用了HttpUrlConnectionAPI来处理http post请求。Christoph-Tobias:谢谢你的解释。Christoph-Tobias:谢谢你的解释。谢谢你的回答!这是一个很好的构建完整url的方法,但是你不关心“查询”中的特殊字符。谢谢你的回答!构建完整url的好方法,但您不关心“查询”中的特殊字符。