Wie zum senden von Abfrage-Parameter an POST-Anforderung von der Java-client, und erhalten mit @QueryParam
Ich versuche zu schreiben, die eine grundlegende web-service, verwendet JAX-RS @QueryParam annotation. Meine Java-client sendet eine POST-Anforderung mit HttpURLConnection. Der Anruf wird an das web-service, aber die Parameter sind nicht immer richtig geschickt (Sie bleiben null). Ich weiß es sind viele Fragen auf StackOverflow, aber ich konnte nicht finden eine überzeugende Lösung. Es wäre toll, wenn jemand darauf hinweist, die Fehler im code unten.
(Ich habe das vereinfacht den code für das posting hier).
Hier ist die web-service-code:
@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();
}
- Und das ist Java-client:
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();
}
Meine web-service wird immer aufgerufen, aber die Werte der parameter erhalten werden, die als null. Bitte helfen Sie.
InformationsquelleAutor Akhil Dixit | 2016-03-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Binden Sie den Wert(s) einer HTTP-query-parameter, um eine Ressource-Methode-parameter mit
@QueryParam
, müssen Sie senden Sie Ihre Parameter im query-string der URL:Standardmäßig in
GET
Anforderungen, die Parameter sind gesendet als Teil der URL. InPOST
Anforderungen, die Parameter sind geschickt in den Körper der Anfrage.Senden query Parameter in
POST
Anfragen mitHttpURLConnection
, Anhängen Sie auf die angeforderte URL, wie folgt:InformationsquelleAutor cassiomolin
@QueryParam
erkennt nur die Parameter, die Teil der URL. Sie benötigen@FormParam
statt, um das Lesen der Parameter aus dem POST-body.InformationsquelleAutor wero
Beachten Sie, dass rfc2616 ist obsolet seit 2014, es ist ersetzt durch die rfc723x-Spezifikationen. Keine rfc723x Servern vorhanden ist, in diesem moment
Einen rfc723x compilant-server antwortet mit status 400:
Einen server erstellen, die akzeptieren beide sind unsicher by design.
Uri-Parameter können und werden geschmiedet von einem hacker.
Wenn Sie einen parameter in der request-uri und in den Nachrichtentext, wie Sie sicher mit der situation umgehen? Welche hat Vorrang?
Ist die einzige vernünftige Antwort auf eine solche Anfrage abzulehnen mit status 400. Sie als Programmierer nicht die Unterscheidung zwischen einem legalen Benutzer und Hackern in dieser situation.
rfc7230 gibt auch an, dass der Parameter darf nur einmal vorkommen.
Warum? Ein Beispiel:
Wen du wählen?
http://voting.com/?vote=clinton
offensichtlich Clinton
Wen du wählen?
http://voting.com/?vote=trump&Stimmen=clinton
Trump? Clinton? Trump und Clinton?
Wen du wählen?
http://voting.com/?vote=trump&Stimmen=clinton&vote=trump
Trump? Trumpf 2 mal und Clinton 1 mal?
rfc2616-Server akzeptieren diese und liefert ein array von Werten für Stimme und sind unsicher by design in diesem Punkt.
InformationsquelleAutor Vicky Ronnen