gpt4 book ai didi

java - 如何从 Java 客户端向 POST 请求发送查询参数,并使用 @QueryParam 接收

转载 作者:行者123 更新时间:2023-12-03 00:57:45 29 4
gpt4 key购买 nike

我正在尝试编写一个使用 JAX-RS @QueryParam 注释的基本 Web 服务。我的 Java 客户端使用 HttpURLConnection 发送 POST 请求。正在对 Web 服务进行调用,但参数未正确发送(它们保持为空)。我知道 StackOverflow 上有很多与此相关的问题,但我找不到令人信服的解决方案。如果有人指出下面代码中的错误,那就太好了。(我已经简化了此处发布的代码)。

这是网络服务代码:

@POST
@Path("/notify")
@Consumes("*/*")
public Response notifyUser(@QueryParam("notification") String notification, @QueryParam("applicationName") String applicationName) {
System.out.println("Notification: " + notification);
System.out.println("Application: " + applicationName);
return Response.status(200).entity(notification + " from " + applicationName).build();
}

这是 Java 客户端:

public static void main(String args[]) {
URL url;
HttpURLConnection conn = null;
try {
url = new URL("http://localhost:8080/...");
conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("charset", "UTF-8");
OutputStream os = conn.getOutputStream();
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new NameValuePair("notification", "Notification string"));
params.add(new NameValuePair("applicationName", "MyApp"));
os.write(getQuery(params).getBytes("UTF-8"));
os.flush();
os.close();
return conn.getResponseCode();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return -1;
} finally {
if (conn != null) {
conn.disconnect();
}
}
}

private String getQuery(List<NameValuePair> params) throws UnsupportedEncodingException {
StringBuilder result = new StringBuilder();
boolean first = true;

for (NameValuePair pair : params) {
if (first)
first = false;
else
result.append("&");

result.append(URLEncoder.encode(pair.getName(), "UTF-8"));
result.append("=");
result.append(URLEncoder.encode(pair.getValue(), "UTF-8"));
}

return result.toString();
}

我的 Web 服务正在被调用,但接收到的参数值为空。请帮忙。

最佳答案

使用 @QueryParam 将 HTTP 查询参数的值绑定(bind)到资源方法参数,您需要在 URL 的查询字符串中发送您的参数:

3.4. Query

The query component contains non-hierarchical data that, along withdata in the path component, serves to identify aresource within the scope of the URI's scheme and naming authority(if any). The query component is indicated by the first questionmark ("?") character and terminated by a number sign ("#") characteror by the end of the URI.

[...]

默认情况下,在 GET 请求中,参数作为 URL 的一部分发送。在 POST 请求中,参数在请求正文中发送

使用 HttpURLConnectionPOST 请求中发送查询参数将它们附加到请求的 URL 中,如下所示:

List<NameValuePair> params = new ArrayList<>();
params.add(new NameValuePair("param1", "value1"));
params.add(new NameValuePair("param2", "value2"));

String query = getQuery(params);
URL url = new URL("http://localhost:8080/api" + "?" + query);
URLConnection connection = url.openConnection();

...

关于java - 如何从 Java 客户端向 POST 请求发送查询参数,并使用 @QueryParam 接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35796264/

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