2
votes

Ajout de valeur au paramètre de chemin dans Java REST?

localhost/scans/launch, 
localhost/scans//launch, 
localhost/scans/?/launch, 
localhost/scans/{scan_id}/launch,

3 commentaires

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 être http: // 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.


4 Réponses :


0
votes

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:

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é!


4 commentaires

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 :)



0
votes

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);


2 commentaires

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é.



0
votes
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();

2 commentaires

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



1
votes

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();


0 commentaires