Avatar billede rina Nybegynder
14. februar 2005 - 12:00 Der er 12 kommentarer og
1 løsning

Oprette eget HttpServletRequest

Hej

Jeg har brug for at oprette mit eget HttpServletRequest fra en java eller jsp side. Det svar/key der kommer tilbage fra mit request, skal bruges i en form på en jsp side.

Jeg er lidt i tvivl om hvordan jeg opretter og sende mit eget HttpServletRequest til en anden server og behandler det tilbagekommende svar.
Er der nogle der kan hjælpe?

Med venlig hilsen
Karina
Avatar billede arne_v Ekspert
14. februar 2005 - 15:02 #1
Du kan sende en HTTP request med (Http)URLConnection klassen.
Avatar billede arne_v Ekspert
14. februar 2005 - 15:03 #2
GET:

        URL url = new URL("http://www.domain.dk/htbin/tell2?nam=val");
        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) {
              System.out.println(new String(b,0,n));
            }
            is.close();
        }
        con.disconnect();

POST:

        URL url = new URL("http://www.domain.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) {
              System.out.println(new String(b,0,n));
            }
            is.close();
        }
        con.disconnect();
Avatar billede arne_v Ekspert
14. februar 2005 - 15:03 #3
Ovenstående kode skriver bare ud. Du skal selvfølgelig så parse indholdet for
de data du skal bruge.
Avatar billede arne_v Ekspert
14. februar 2005 - 15:04 #4
NB: Hvis det er en web service så finde der andre og bedre måder at kalde på !
Avatar billede rina Nybegynder
14. februar 2005 - 15:51 #5
Hej Arne
Tak for dit svar. 
Jeg har lavet en hurtig test med POST eksemplet og det virker fint med alle andre sider end den jeg skal bruge. ;-)
Men derfor er dit svar godt nok til at give dig point hvis du sender et svar.

Det er desværre ikke en webservice.

Ekstra spørgsmål/issues:
-jeg har brug for en timeout på min. 30000 -men hvordan sætter jeg den?
-Så skal jeg spørge på en https forbindelse, som URL klassen ikke virker alt for glad for, kan det passe? og hvad gør man så?
-Jeg har brug for at sende POST parameter med (f.eks. bruger navn og password) -der går jeg ud fra det er setRequestProperty metoden der skal bruges?

Med venlig hilsen
Karina
Avatar billede arne_v Ekspert
14. februar 2005 - 15:58 #6
svar
Avatar billede arne_v Ekspert
14. februar 2005 - 15:59 #7
Hvilken fejl får du mod de relevante side ?
Avatar billede arne_v Ekspert
14. februar 2005 - 16:00 #8
Det er ikke supporteret at sætte timeout.

Men prøv:

System.setProperty( "sun.net.client.defaultConnectTimeout", "30000");
Avatar billede arne_v Ekspert
14. februar 2005 - 16:02 #9
HTTPS er lidt mere tricky.

Jeg lavede engang dette eksempel:

import java.net.*;
import java.io.*;
import java.security.*;
import java.security.cert.*;

import javax.net.ssl.*;

public class HttpsGet {
  public static void main(String[] args) {
      try {
        SSLContext sslctx = SSLContext.getInstance("SSL");
        sslctx.init(null, new X509TrustManager[] { new MyTrustManager() }, null);
        HttpsURLConnection.setDefaultSSLSocketFactory(sslctx.getSocketFactory());
        //HttpsURLConnection.setDefaultHostnameVerifier(new MyHostnameVerifier());
        URL url = new URL("https://www.xxxx.dk/");
        HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
        if (con.getResponseCode() == HttpsURLConnection.HTTP_OK) {
            InputStream is = con.getInputStream();
            OutputStream os = new FileOutputStream("C:\\z.z");
            byte[] b = new byte[1000];
            int n;
            while ((n = is.read(b)) >= 0) {
              os.write(b, 0, n);
            }
            os.close();
            is.close();
        }
        con.disconnect();
      } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
      } catch (KeyManagementException e) {
        e.printStackTrace();
      } catch (MalformedURLException e) {
        e.printStackTrace();
      } catch (FileNotFoundException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
  }
}
class MyTrustManager implements X509TrustManager
{
    public void checkClientTrusted(X509Certificate[] chain, String authType) {
    }
    public void checkServerTrusted(X509Certificate[] chain, String authType) {
    }
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }
}

//class MyHostnameVerifier implements HostnameVerifier {
//  public boolean verify(String urlHostName, SSLSession session) {
//      return true;
//  }
//}

Det kræver java 1.4.x eller nyere
Avatar billede arne_v Ekspert
14. februar 2005 - 16:03 #10
I mit oprindelige eksempel svarer:

String info = "nam=val";

til en

<input type="text" name="nam"/>

hvor brugeren har skrivet værdien:

val
Avatar billede rina Nybegynder
14. februar 2005 - 16:25 #11
Timeout tricket ser i første omgang ikke ud til at virke, men det kan hænge sammen med at jeg stadig ikke har fået hentet java 1.4.x og dermed heller ikke spørger på https endnu.
Avatar billede rina Nybegynder
14. februar 2005 - 16:28 #12
Den fejl jeg få er følgende:
java.net.ConnectException: Operation timed out: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:350)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:137)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:124)
    at java.net.Socket.<init>(Socket.java:268)
    at java.net.Socket.<init>(Socket.java:95)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:45)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:330)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:516)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:266)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:276)
    at sun.net.www.http.HttpClient.New(HttpClient.java:288)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:417)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:464)
    at org.apache.jsp.dlg.test_jsp._jspService(test_jsp.java:66)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
Avatar billede arne_v Ekspert
14. februar 2005 - 16:33 #13
sun.net.client.defaultConnectTimeout kræver vist også 1.4.x eller nyere
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