public static void handleActionRedirect(Context context, String path, String baseUrl) throws IOException { String method; String location; if (!path.contains("@")) { method = HttpMethod.GET; location = path; } else { int lastIndex = path.indexOf("@") + 1; method = path.substring(lastIndex); location = path.substring(0, lastIndex - 1); } StringBuilder sb = new StringBuilder(""); String param = null; if (path.contains("?")) { int lastIndex2 = path.indexOf("?") + 1; param = path.substring(lastIndex2); String[] params = param.split("&"); for (String para : params) { String[] p = para.split("="); sb.append(String.format("<input name='%s' value='%s' />", p[0], p[1])); } method = method.substring(0, method.indexOf("?")); } if (HttpMethod.GET.equalsIgnoreCase(method)) { String pa = param == null ? "" : "?" + CommonUtil.replaceChinese2Utf8(param); context.getResponse().sendRedirect(baseUrl + location + pa); return; } String _method = ""; if (HttpMethod.PUT.equalsIgnoreCase(method) || HttpMethod.DELETE.equalsIgnoreCase(method)) { _method = new String(method); method = HttpMethod.POST; } String action = baseUrl + location; // 构造一个Form表单模拟客户端发送新的Action请求 String format = "<form id='ACTION_REDIRECT_FORM' action='%s' method='%s' ><input name='_method' value='%s' />%s<input type='submit' /></form>"; String form = String.format(format, action, method, _method, sb.toString()); String js = "<script>document.getElementById('ACTION_REDIRECT_FORM').submit();</script>"; context.getWriter().print(form + js); }
public String requestString( int timeout, String url, String method, Object body, Pair<String, ?>... parameters) throws IOException, ServerException, ForbiddenException, NotFoundException, UnauthorizedException, ConflictException { final String authToken = getAuthenticationToken(); if ((parameters != null && parameters.length > 0) || authToken != null) { final UriBuilder ub = UriBuilder.fromUri(url); // remove sensitive information from url. ub.replaceQueryParam("token", null); if (parameters != null && parameters.length > 0) { for (Pair<String, ?> parameter : parameters) { String name = URLEncoder.encode(parameter.first, "UTF-8"); String value = parameter.second == null ? null : URLEncoder.encode(String.valueOf(parameter.second), "UTF-8"); ub.replaceQueryParam(name, value); } } url = ub.build().toString(); } final HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); conn.setConnectTimeout(timeout > 0 ? timeout : 60000); conn.setReadTimeout(timeout > 0 ? timeout : 60000); try { conn.setRequestMethod(method); // drop a hint for server side that we want to receive application/json conn.addRequestProperty(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON); if (authToken != null) { conn.setRequestProperty(HttpHeaders.AUTHORIZATION, authToken); } if (body != null) { conn.addRequestProperty(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); conn.setDoOutput(true); if (HttpMethod.DELETE.equals( method)) { // to avoid jdk bug described here // http://bugs.java.com/view_bug.do?bug_id=7157360 conn.setRequestMethod(HttpMethod.POST); conn.setRequestProperty("X-HTTP-Method-Override", HttpMethod.DELETE); } try (OutputStream output = conn.getOutputStream()) { output.write(DtoFactory.getInstance().toJson(body).getBytes()); } } final int responseCode = conn.getResponseCode(); if ((responseCode / 100) != 2) { InputStream in = conn.getErrorStream(); if (in == null) { in = conn.getInputStream(); } final String str; try (Reader reader = new InputStreamReader(in)) { str = CharStreams.toString(reader); } final String contentType = conn.getContentType(); if (contentType != null && contentType.startsWith(MediaType.APPLICATION_JSON)) { final ServiceError serviceError = DtoFactory.getInstance().createDtoFromJson(str, ServiceError.class); if (serviceError.getMessage() != null) { if (responseCode == Response.Status.FORBIDDEN.getStatusCode()) { throw new ForbiddenException(serviceError); } else if (responseCode == Response.Status.NOT_FOUND.getStatusCode()) { throw new NotFoundException(serviceError); } else if (responseCode == Response.Status.UNAUTHORIZED.getStatusCode()) { throw new UnauthorizedException(serviceError); } else if (responseCode == Response.Status.CONFLICT.getStatusCode()) { throw new ConflictException(serviceError); } else if (responseCode == Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()) { throw new ServerException(serviceError); } throw new ServerException(serviceError); } } // Can't parse content as json or content has format other we expect for error. throw new IOException( String.format( "Failed access: %s, method: %s, response code: %d, message: %s", UriBuilder.fromUri(url).replaceQuery("token").build(), method, responseCode, str)); } final String contentType = conn.getContentType(); if (!(contentType == null || contentType.startsWith(MediaType.APPLICATION_JSON))) { throw new IOException(conn.getResponseMessage()); } try (Reader reader = new InputStreamReader(conn.getInputStream())) { return CharStreams.toString(reader); } } finally { conn.disconnect(); } }