Avatar billede kristianp Nybegynder
23. juli 2003 - 15:40 Der er 21 kommentarer og
1 løsning

Kald cgi script fra servlet

Hvordan kalder man et cgi script fra en servlet.
Avatar billede medions Nybegynder
23. juli 2003 - 15:44 #1
No can do!

Jeg er ret sikker på at det ikke kan lade sig gøre, men alligevel en smugle usikker ;o)

//>Rune
Avatar billede arne_v Ekspert
23. juli 2003 - 15:46 #2
Helt ligesom du kalder et cgi-script fra en Java applikation.

URL url = new URL("http://www.xxxx.dk/cgi-bin/test");
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.connect();

Ovenstående er kun til en GET.

Skal du lave en POST ?
Avatar billede kristianp Nybegynder
23. juli 2003 - 15:49 #3
Jeg skal kalde et script, en kollega har lavet der laver noget db opslag, og returnere en tab separeret list af værdier, jeg skal formatere lidt pænt til brugeren.
Avatar billede arne_v Ekspert
23. juli 2003 - 15:51 #4
Jo.

Men skal detCI-script kaldes med en GET eller med en POST request ?

Begge er muligt.

GET er bare lidt nemmere.
Avatar billede kristianp Nybegynder
23. juli 2003 - 16:12 #5
Det skal nok være en post, jeg skal ihvertfald give en parameter med til det
Avatar billede arne_v Ekspert
23. juli 2003 - 16:13 #6
Her er et komplet eksempel på en servlet som bare sender en GET request
og bare outputter resulatet.

package test;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.net.*;

public class CopyServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
          URL url = new URL("http://www.xxxx.dk/cgi-bin/test");
          HttpURLConnection con = (HttpURLConnection)url.openConnection();
          con.connect();
          if(con.getResponseCode() == HttpURLConnection.HTTP_OK) {
              InputStream is = con.getInputStream();
              byte[] b = new byte[1000];
              int n;
              while((n = is.read(b)) >= 0) {
                String s = new String(b,0,n);
                response.getOutputStream().println(s);
              }
              is.close();
          }
          con.disconnect();
        } catch (MalformedURLException e) {
          e.printStackTrace();
        } catch (FileNotFoundException e) {
          e.printStackTrace();
        } catch (IOException e) {
          e.printStackTrace();
        }
    }
}
Avatar billede arne_v Ekspert
23. juli 2003 - 16:14 #7
Du kan godt give en parameter med til en GET via en URL som:

http://www.xxxx.dk/cgi-bin/test?navn=værdi

men spørgsmålet er om CGI scriptet understøtter det.

Hvis ikke så skal ovenstående eksempel modificeres lidt.

Jeg kan godt prøve at lave et eksempel på POST også.
Avatar billede kristianp Nybegynder
23. juli 2003 - 16:17 #8
Det ville være lækkert
Avatar billede kristianp Nybegynder
23. juli 2003 - 16:18 #9
Skal man kalde scriptet med en http url...
Avatar billede arne_v Ekspert
23. juli 2003 - 16:20 #10
Øh ja.

CGI-script køres af HTTP-server og har derfor en HTTP URL.

Vi snakker om et CGI-script og ikke et normalt shell script ?
Avatar billede kristianp Nybegynder
23. juli 2003 - 16:23 #11
Det tør jeg faktisk ikke lige sige, men jeg skal lige have fat i ham der har lavet det.....
Avatar billede arne_v Ekspert
23. juli 2003 - 17:05 #12
Der er lidt vigtigt at få det afklaret !
Avatar billede kristianp Nybegynder
23. juli 2003 - 19:06 #13
Kan ikke fange ham mere idag, men jeg vender tilbage i morgen.
Avatar billede kristianp Nybegynder
23. juli 2003 - 19:15 #14
Det er et normalt shell script, men det ligger bare under cgi-bin kataloget i apache....
Avatar billede arne_v Ekspert
23. juli 2003 - 19:27 #15
Kan du køre det ved at connecte til apache fra en browser ?

http://server-med-apache/cig-bin/navn-på-script
Avatar billede kristianp Nybegynder
24. juli 2003 - 08:07 #16
Jepper
Avatar billede arne_v Ekspert
24. juli 2003 - 08:11 #17
Godt.

Så er det et CGI script.

CGI = Common Gateway Interface = en protokol mellem web-servere og scripts

Har du fået at vide om du kan bruge GET eller det skal være POST ?
Avatar billede arne_v Ekspert
24. juli 2003 - 08:22 #18
POST må så være:

package test;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.net.*;

public class CopyServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
        URL url = new URL("http://arne.vajhoej.dk/htbin/tell2");
        HttpURLConnection con = (HttpURLConnection)url.openConnection();
        con.setRequestMethod("POST");
        String info = "nam=val";
        con.setDoOutput(true);
        con.getOutputStream().write(info.getBytes());
        con.connect();
        if(con.getResponseCode() == HttpURLConnection.HTTP_OK) {
            InputStream is = con.getInputStream();
            byte[] b = new byte[1000];
            int n;
            while((n = is.read(b)) >= 0) {
              response.getOutputStream().println(new String(b,0,n));
            }
            is.close();
        }
        con.disconnect();
        } catch (MalformedURLException e) {
          e.printStackTrace();
        } catch (FileNotFoundException e) {
          e.printStackTrace();
        } catch (IOException e) {
          e.printStackTrace();
        }
    }
}
Avatar billede arne_v Ekspert
24. juli 2003 - 08:24 #19
Præcis samme kode som med GET bare:

        con.setRequestMethod("POST");
        String info = "nam=val";
        con.setDoOutput(true);
        con.getOutputStream().write(info.getBytes());

syntaxen for info er:

navn1=værdi1&navn2=værdi2&navn3=værdi3
Avatar billede kristianp Nybegynder
24. juli 2003 - 08:33 #20
Jeg må vist selv bestemme om jeg bruger get eller post
Avatar billede arne_v Ekspert
24. juli 2003 - 08:35 #21
Så brug get. Det er nemmere.

Så tager du min kode fra 23/07-2003 16:13:02 som udgangs punkt og
retter til.

Den skriver jo kun det modtagne ud uændret. Og du skal så "pynte"
lidt på data inden det outputtes.
Avatar billede kristianp Nybegynder
24. juli 2003 - 08:37 #22
ok, jeg takker mange gange for den prof vejledning...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester