2009-11-15 75 views
3

我需要使用谷歌Web工具包(GWT) 我试过这个来从URL(http://myweb.com/test.php)内容:获得来自URL内容与GWT

GWT:

RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, 
"http://myweb.com/test.php?id=65472"); 
    try { 
     rb.sendRequest(null, new RequestCallback() { 
      public void onError(final Request request, final Throwable exception) { 
       Window.alert(exception.getMessage()); 
      } 
      public void onResponseReceived(final Request request, final Response response) { 
       //do something 
       GWT.log("response: (" + response.getText() + ")", null); 
      } 
     }); 
    } catch (final Exception e) { 
      Window.alert(e.getMessage()); 
    } 

PHP:

<?php 

$var1 = $_GET["id"]; 
echo "The id is: ".$var1; 

?> 

但它总是返回空 - > response();

+1

我只能尽量去猜测,但是请检查response.getStatusCode(),以及确保从同一个域,因为这要求是可能的“相同的原产地政策”问题。 – 2009-11-15 19:42:22

+0

它返回的StatusCode(0)。这是什么意思? – isiaatz 2009-11-15 20:10:21

回答

2

OK,解决。它不适用于“托管模式”,只是编译,将文件移动到服务器,它的工作原理。

+1

有用的了解,但是对于开发和调试解决方案不是非常有用。 – lilbyrdie 2010-11-24 19:40:16

4

你可以使用托管模式下的代理servlet。

如果您注册所提供的servlet在web.xml中正确的路径下,并设置在servlet你的PHP服务器的正确的主机/端口,那么你就可以张贴到在托管模式开发服务器。

注意只发布实施.....

public class ProxyServlet extends HttpServlet { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 8L; 

    private static final String targetServer  = "localhost"; 
    private static final int targetPort   = 80; 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     System.err.println("GET NOT implemented!"); 
     resp.sendError(HttpStatus.ORDINAL_501_Not_Implemented); 
    } 

    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { 
     handleRequest(req, res); 
    } 

    @SuppressWarnings("unchecked") 
    protected void handleRequest(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 

     final StringBuffer file = new StringBuffer(); 

     file.append(req.getRequestURI()); 
     if (req.getQueryString() != null) { 
      file.append("?" + req.getQueryString()); 
     } 

     HttpURLConnection conn = (HttpURLConnection) new URL("http", targetServer, targetPort, file.toString()).openConnection(); 

     conn.setRequestMethod("POST"); 

     // copy header 
     // copy headers 
     Enumeration headerNames = req.getHeaderNames(); 
     while (headerNames.hasMoreElements()) { 
      String name = (String) headerNames.nextElement(); 
      String value = req.getHeader(name); 

      value = value.replace(":8080", ":80"); 

      conn.addRequestProperty(name, value); 
     } 

     conn.setDoOutput(true); 

     try { 
      OutputStream out = conn.getOutputStream(); 
      fastStreamcopy(req.getInputStream(), out); 
     } catch (Exception e) { 
      resp.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE, "Server down"); 
      return; 
     } 

     try { 
      int code = conn.getResponseCode(); 
      String msg = conn.getResponseMessage(); 

      System.out.println("code: " + code + ", msg: " + msg); 
      resp.setStatus(code, msg); 
      Map<String, List<String>> headerFields = conn.getHeaderFields(); 

      for (Map.Entry<String, List<String>> e : headerFields.entrySet()) { 
       for (String val : e.getValue()) { 
        if (e.getKey() != null) 
         resp.addHeader(e.getKey(), val); 
       } 
      } 

      // Try normal stream, then error stream and accept if remote host says that there is no content. 
      try { 
       fastStreamcopy(conn.getInputStream(), resp.getOutputStream()); 
      } catch (IOException e) { 
       try { 
        fastStreamcopy(conn.getErrorStream(), resp.getOutputStream()); 
       } catch (Exception e1) { 
        if (conn.getContentLength() == 0) { 
         // That ok - nothing there 
        } else { 
         throw e; 
        } 

       } 
      } 
     } catch (IOException e) { 
      System.err.println(e.getMessage()); 
      throw e; 
     } 

    } 

    public static void fastStreamcopy(InputStream input, OutputStream output) throws IOException { 
     final ReadableByteChannel inputChannel = Channels.newChannel(input); 
     final WritableByteChannel outputChannel = Channels.newChannel(output); 
     // copy the channels 
     fastChannelCopy(inputChannel, outputChannel); 
    } 

    public static void fastChannelCopy(final ReadableByteChannel src, final WritableByteChannel dest) throws IOException { 
     final ByteBuffer buffer = ByteBuffer.allocateDirect(16 * 1024); 
     while (src.read(buffer) != -1) { 
      // prepare the buffer to be drained 
      buffer.flip(); 
      // write to the channel, may block 
      dest.write(buffer); 
      // If partial transfer, shift remainder down 
      // If buffer is empty, same as doing clear() 
      buffer.compact(); 
     } 
     // EOF will leave buffer in fill state 
     buffer.flip(); 
     // make sure the buffer is fully drained. 
     while (buffer.hasRemaining()) { 
      dest.write(buffer); 
     } 
    } 
}