localhost/scans/launch, localhost/scans//launch, localhost/scans/?/launch, localhost/scans/{scan_id}/launch,
4 Réponses :
Comme indiqué ici , la solution serait pour changer le type de contenu en application / x-www-form-urlencoded
, mais puisque vous utilisez déjà application / json; charset = UTF-8
(ce que je suppose est une exigence de votre projet), vous n'avez pas le choix de reconcevoir le tout. Je vous suggère l'une des solutions suivantes:
application / x-www-form-urlencoded
; S'il y a d'autres solutions dont je ne suis pas au courant, je ne sais pas dans quelle mesure elles seraient compatibles avec le protocole HTTP.
(Plus d'infos) < / p>
J'espère avoir aidé!
Je pense que je vais examiner plus en détail si je peux changer le type de contenu ou le laisser de côté comme mentionné et je reviendrai quand j'en saurai plus :) apprécier l'aide.
J'ai changé le type de contenu mais malheureusement j'ai encore des problèmes pour définir l'URL pour commencer. Je suis parvenu à l'API auparavant avec juste localhost / scans et localhost / session, mais dès qu'il y a un paramètre, je ne peux pas trouver l'appel d'API même s'il est spécifié comme dans le haut de mon code. un indice sur la façon dont je le structurerais ?.
Je ne suis pas trop expérimenté sur le sujet mais je n'exclurais pas qu'il soit causé par une mauvaise configuration de votre serveur d'application et / ou des paramètres de votre projet de telle sorte que seule l'url qui fonctionne est réellement publiée. Je vérifierais cela.
c'est une ressource externe, donc la façon dont elle est publiée est en effet une bonne question. mais je suis coincé avec le problème d'obtenir en quelque sorte l'URL acceptée, qu'une analyse existe ou non. mais j'apprécie vraiment l'aide :)
Pourquoi vous n'utilisez pas comme ça. Puisque vous devez effectuer un POST
avec HttpURLConnection
, vous devez écrire les paramètres dans la connexion après avoir ouvert la connexion.
String urlParameters = "42324/launch"; byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8); DataOutputStream dataOutputStream = new DataOutputStream(conn.getOutputStream()); dataOutputStream.write(postData);
Ou si vous avez lancer
à la fin, changez simplement le code ci-dessus pour le suivant,
String urlParameters = "scan_id=42324"; byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8); DataOutputStream dataOutputStream = new DataOutputStream(conn.getOutputStream()); dataOutputStream.write(postData);
considérant que je le ferais comme ça, à quoi ressemblerait l'URI d'origine? - localhost / scans / launch, - localhost / scans // launch, - localhost / scans /? / launch, - localhost / scans / {scan_id} / launch,
échoue toujours après avoir ajouté le code ci-dessus (essayé les deux) et changé l'URL .. je ne suis pas sûr de ce que je fais mal car je continue juste à obtenir 400 .. je ne peux que suspecter l'URL car cela fonctionnait avec un POST sur localhost / session mais ne fonctionnera pas sur un hôte local / scan ect. Je veux ajouter si je ne l'ai pas précisé auparavant, que l'URL fournie est localhost / scans / {scan_id} / launch où localhost est un remplacement pour l'hôte correct car c'est privé.
import org.springframework.web.util.UriTemplate; import java.net.url; // Warning - UNTESTED code ahead UriTemplate template = new UriTemplate("http://localhost/scans/{scan_id}/launch"); Map<String,String> uriVariables = Collections.singletonMap("scan_id", "42324"); URI uri = template.expand(uriVariables); URL url = uri.toURL();
J'ai essayé d'implémenter votre exemple au printemps en utilisant la bibliothèque spring et cela me dit que je ne peux pas convertir d'UriTemplate en URL (l'UriTemplate provient du springframework). d'autres notes ?. Je suis honnêtement en train de descendre un peu dans l'implémentation actuelle et je me demandais s'il y avait autre chose que vous pourriez recommander, toujours applicable en Java? Il est important que je puisse ajouter aux en-têtes de demande et à la charge utile. Tout commentaire est apprécié :)
Exemple mis à jour - J'ai fait une erreur dans la transcription
Donc, avec l'aide d'un ami et de tout le monde ici, j'ai résolu mon problème.
Le code ci-dessous est tout le code d'une classe entière expliqué petit à petit. en bas, vous avez la classe complète avec toute sa syntaxe, etc., qui prend des paramètres et renvoie une chaîne.
dans une requête HTTP, il y a certaines sections. Ces sections incluent dans mon cas, des en-têtes de requête, des paramètres dans l'URL et une charge utile.
en fonction de l'API, certaines variables requises par l'API doivent entrer dans leur catégorie respective.
public String requestScan(int scan_Id, String token, String ID) throws MalformedInputException, ProtocolException, IOException { try { String endpoint = "https://host:port/scans/" + scan_Id + "/export?history_id=" ID; URL url = new URL(endpoint); String payload= "{\"format\" : \"csv\"}"; HttpsURLConnection con = (HttpsURLConnection) url.openConnection(); con.setDoInput(true); con.setDoOutput(true); con.setRequestMethod("POST"); con.setRequestProperty("Accept", "application/json"); con.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); con.setRequestProperty("X-Cookie", "token=" + token); con.setRequestProperty("X-ApiKeys", "accessKey="+"324324;" + "secretKey="+"43242;"); //WRITING THE PAYLOAD to the http call OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream(), "UTF-8"); writer.write(payload); writer.close(); //READING RESPONSE BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream())); StringBuffer jsonString = new StringBuffer(); String line; while ((line = br.readLine()) != null) { jsonString.append(line); } br.close(); con.disconnect(); return jsonString.toString(); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } }
et l'API que j'appelle nécessitaient un argument dans la charge utile appelé "format" avec une valeur.
//WRITING THE PAYLOAD to the http call OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream(), "UTF-8"); writer.write(payload); writer.close();
Donc, avec ma nouvelle URL, j'ai ouvert une connexion et définissez les en-têtes de requête que je devais définir.
con.setDoInput(true); con.setDoOutput(true); con.setRequestMethod("POST"); con.setRequestProperty("Accept", "application/json"); con.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); con.setRequestProperty("X-Cookie", "token=" + token); con.setRequestProperty("X-ApiKeys", "accessKey="+"23243;" +"secretKey="+"45543;");
Le setDoOutput doit être commenté lors d'une requête GET.
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
Reportez-vous à stackoverflow.com/questions/14551194/...
Utilisez-vous des paramètres de chemin?
scan_id = 42324
est un paramètre de requête. Dans votre cas, le paramètre de chemin doit êtrehttp: // localhost / scans / 42324 / launch
.Je crois que je veux que le 42324 soit dans la requête. Lorsque j'envoie le chemin localhost / scans / 42324 / launch , l'API ne le comprend pas et répond avec un code de réponse 400.