我需要使用Google Web Toolkit(GWT)从网址(http://myweb.com/test.php)获取内容 我试过这个:
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;
?>
但它总是返回空 - &gt;响应();
答案 0 :(得分:4)
您可以在托管模式下使用代理Servlet。
如果在web.xml中的正确路径下注册提供的servlet,并在servlet中设置PHP服务器的正确主机/端口,则可以以托管模式发布到开发服务器。
注意仅实施POST .....
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);
}
}
}
答案 1 :(得分:2)
好的,解决了。它不适用于“托管模式”,只需编译,将文件移动到服务器即可运行。