java HttpURLConnection.setRequestMethod() doesn't work

断了今生、忘了曾经 提交于 2019-12-23 07:26:47

问题


i want to change the request methodo from GET to POST. This is my code:

HttpURLConnection connection = null;  

     URL url = new URL("https://accounts.google.com/o/oauth2/token");

     connection = (HttpURLConnection) url.openConnection();
     connection.setRequestMethod("POST");
     connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
     connection.setUseCaches (false);
     connection.setDoInput(true);
     connection.setDoOutput(true);

But as u see in this image while debugging the methodo of the request doesn't change:


回答1:


That's just an implementation detail. The HttpsURLConnectionImpl object has a reference to a delegate, and sets that delegate's request method. If you expand the delegate field and check its method field, you'll see POST.

If you follow through with the code, you'll also see it attempts to send a POST request.




回答2:


Solution 1:-Use below code:-

private void sendPost() throws Exception {

    String url = "https://accounts.google.com/o/oauth2/token";
    URL obj = new URL(url);
    HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

    //add reuqest header
    con.setRequestMethod("POST");
    con.setRequestProperty("User-Agent", "Mozilla/5.0");
    con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
    con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

    String urlParameters = "";

    // Send post request
    con.setDoOutput(true);
    DataOutputStream wr = new DataOutputStream(con.getOutputStream());
    wr.writeBytes(urlParameters);
    wr.flush();
    wr.close();

    int responseCode = con.getResponseCode();

    System.out.println("Response Code : " + responseCode);

    BufferedReader in = new BufferedReader(
            new InputStreamReader(con.getInputStream()));
    String inputLine;
    StringBuffer response = new StringBuffer();

    while ((inputLine = in.readLine()) != null) {
        response.append(inputLine);
    }
    in.close();


    System.out.println(response.toString());

}

Solution 2:- Use Spring / Netty rest template

public class HttpRequestProcessor {

@Autowired
private AsyncHttpClient asyncHttpClient;

private static final Logger logger_c = LoggerFactory
        .getLogger(HttpRequestProcessor.class);

public enum HttpMethod {
    HTTP_GET, HTTP_POST, HTTP_DELETE
}

public static final int HTTP_GET = 1;
public static final int HTTP_POST = 2;
public static final int HTTP_DELETE = 3;

// private static AsyncHttpClient client;


  public HttpRequestProcessor() {

  LOGGER.info("HttpRequestProcessor created");


  Create Nett Http provider configuration for asynchronous connect
  operation

  NettyAsyncHttpProviderConfig nettyAsyncHttpProviderConfig = new
  NettyAsyncHttpProviderConfig(); nettyAsyncHttpProviderConfig.addProperty(
  NettyAsyncHttpProviderConfig.EXECUTE_ASYNC_CONNECT, true);
  nettyAsyncHttpProviderConfig.addProperty(
  NettyAsyncHttpProviderConfig.DISABLE_NESTED_REQUEST, false);

  AsyncHttpClientConfig config = new AsyncHttpClientConfig.Builder()
  .setAllowPoolingConnection(true) .setAllowSslConnectionPool(true)
  .setMaximumConnectionsPerHost(500) .setMaximumConnectionsTotal(800)
  .setIdleConnectionTimeoutInMs(60000)
  .setConnectionTimeoutInMs(5000).setRequestTimeoutInMs(25000)
  .setAsyncHttpClientProviderConfig(nettyAsyncHttpProviderConfig) .build();

  client = new AsyncHttpClient(new NettyAsyncHttpProvider(config), config);
  }


private String getRequestType(HttpMethod method) {
    switch (method) {
    case HTTP_DELETE:
        return "DELETE";
    case HTTP_GET:
        return "GET";
    case HTTP_POST:
        return "POST";
    default:
        return null;
    }
}

private RequestBuilder createRequestBuilder(HttpMethod method, String url,
        Map<String, String> headers, Map<String, String> queryParameters) {
    RequestBuilder requestBuilder = new RequestBuilder(
            getRequestType(method));
    requestBuilder.setUrl(url);
    if (headers != null) {
        for (Map.Entry<String, String> header : headers.entrySet()) {
            requestBuilder.setHeader(header.getKey(), header.getValue());
        }
    }
    if (queryParameters != null) {
        for (Map.Entry<String, String> requestParameter : queryParameters
                .entrySet()) {
            requestBuilder.addQueryParameter(requestParameter.getKey(),
                    requestParameter.getValue());
        }
    }
    return requestBuilder;
}

public Future<?> submitRequest(HttpMethod method, String url,
        Map<String, String> headers, Map<String, String> queryParameters,
        Map<String, String> postParameters, String bodyData,
        AsyncHandler<?> asyncHandler) throws IOException {
    RequestBuilder requestBuilder = createRequestBuilder(
            HttpMethod.HTTP_POST, url, headers, queryParameters);
    if (postParameters != null) {
        for (Map.Entry<String, String> posParameter : postParameters
                .entrySet()) {
            requestBuilder.addParameter(posParameter.getKey(),
                    posParameter.getValue());
        }
    }
    if (bodyData != null)
        requestBuilder.setBody(bodyData);
    return submitRequest(requestBuilder.build(), asyncHandler);
}

public Future<?> submitPostRequest(String url, Map<String, String> headers,
        Map<String, String> queryParameters,
        Map<String, String> postParameters, AsyncHandler<?> asyncHandler)
        throws IOException {
    return submitRequest(HttpMethod.HTTP_POST, url, headers,
            queryParameters, postParameters, null, asyncHandler);
}

public Future<?> submitPostRequest(String url, Map<String, String> headers,
        Map<String, String> queryParameters, String bodyData,
        AsyncHandler<?> asyncHandler) throws IOException {
    return submitRequest(HttpMethod.HTTP_POST, url, headers,
            queryParameters, null, bodyData, asyncHandler);
}

public Future<?> submitGetRequest(String url, Map<String, String> headers,
        Map<String, String> queryParameters, AsyncHandler<?> asyncHandler)
        throws IOException {
    return submitRequest(
            createRequestBuilder(HttpMethod.HTTP_GET, url, headers,
                    queryParameters).build(), asyncHandler);
}

public Future<?> submitRequest(Request request, AsyncHandler<?> asyncHandler)
        throws IOException {
    return asyncHttpClient.executeRequest(request, asyncHandler);
}

/
  public Future<Response> submitGetRequests(String url, String bodyParam,
  AsyncCompletionHandlerBase asyncHandler) throws IOException {

  RequestBuilder requestBuilder = new RequestBuilder("GET").setUrl(url); //
  requestBuilder.setBody(bodyParam); Future<Response> responseFuture =
  asyncHttpClient.executeRequest( requestBuilder.build(), new
  AsyncCompletionHandlerBase());

  return responseFuture; }
 /

public Future<?> submitPostRequest(String url,
        Map<String, String> requestHeaders, String body,
        AsyncCompletionHandlerBase asyncHandler) throws IOException {
    return submitRequest(
            createRequestBuilder(HttpMethod.HTTP_POST, requestHeaders, url,
                    body).build(), asyncHandler);
}

private RequestBuilder createRequestBuilder(HttpMethod method,
        Map<String, String> requestHeaders, String url, String body) {
    RequestBuilder requestBuilder = new RequestBuilder(
            getRequestType(method));
    requestBuilder.setUrl(url);
    requestBuilder.setBody(body);

    requestBuilder.setHeader("Content-Type", "application/json");
    if (requestHeaders != null)
        for (Map.Entry<String, String> entry : requestHeaders.entrySet()) {
            requestBuilder.setHeader(entry.getKey(), entry.getValue());
        }
    logger_c.info("Request is :" + requestBuilder.toString());
    return requestBuilder;
}

}



来源:https://stackoverflow.com/questions/28114663/java-httpurlconnection-setrequestmethod-doesnt-work

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!