简体   繁体   中英

HttpUrlConnection PUT method doesn't work

I've done the following client application to consume REST services (a PUT method) using AppacheHttpClient (it's working) :

    public class UserLogin {

    private static final String URL = "http://192.168.1.236:8080/LULServices/webresources";

    public static void main(String[] args) throws Exception {

    final DefaultHttpClient httpclient = new DefaultHttpClient();

    try {
            httpclient.getCredentialsProvider().setCredentials(
                new AuthScope("localhost", 8080),
                new UsernamePasswordCredentials("xxxxx", "xxxxx"));

    HttpPut httpPut = new HttpPut(URL + "/services.users/login");
    HttpConnectionParams.setConnectionTimeout(httpclient.getParams(), 10000);

    httpPut.addHeader("Content-type", "multipart/form-data");

    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    nameValuePairs.add(new BasicNameValuePair("login", "xxxxx"));
    nameValuePairs.add(new BasicNameValuePair("password", "xxxxx"));

    httpPut.setEntity(new UrlEncodedFormEntity(nameValuePairs));

    HttpResponse response = httpclient.execute(httpPut);

    try {
            HttpEntity entity = response.getEntity();
            String putResponse = EntityUtils.toString(entity);
            System.out.println("Login successful! Secret id: " + putResponse);
            EntityUtils.consume(entity);

        } finally {
            httpPut.releaseConnection();
        }

        } finally {
            httpclient.getConnectionManager().shutdown();
        }
    }
}

Now I want to do the same, using HttpUrlConnection , but is not working:

    public class PUTmethod {

    public static void main(String[] args) throws Exception
    {
        HttpURLConnection urlConnection = null;

    try {
        String webPage = "http://localhost:8080/LULServices/webresources/services.users/login";

                Authenticator myAuth = new Authenticator() 
                {
                  final static String USERNAME = "xxxxx";
                  final static String PASSWORD = "xxxxx";

                  @Override
                  protected PasswordAuthentication getPasswordAuthentication()
                  {
                    return new PasswordAuthentication(USERNAME, PASSWORD.toCharArray());
                  }
                };

                Authenticator.setDefault(myAuth);

        URL urlToRequest = new URL(webPage);
        urlConnection = (HttpURLConnection) urlToRequest.openConnection();

                urlConnection.setReadTimeout(10000);
                urlConnection.setConnectTimeout(15000);
                urlConnection.setRequestMethod("PUT");
                urlConnection.setRequestProperty("Content-type", "multipart/form-data");
                urlConnection.setDoOutput(true);
                urlConnection.setDoInput(true);

                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                nameValuePairs.add(new BasicNameValuePair("login", "xxxxx"));
                nameValuePairs.add(new BasicNameValuePair("password", "xxxxx"));

                OutputStream out = urlConnection.getOutputStream();
                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));
                writer.write(getQuery(nameValuePairs));
                writer.close();
                out.close();

                urlConnection.connect();

    } catch (MalformedURLException e) {
            e.printStackTrace();
    } catch (IOException e) {
            System.out.println("Failure processing URL");
            e.printStackTrace();
    } catch (Exception e) {
            e.printStackTrace();
    }
        finally {
        if (urlConnection != null) {
            urlConnection.disconnect();
        }
    }
    }
public static String getQuery(List<NameValuePair> params) throws UnsupportedEncodingException
    {
        StringBuilder result = new StringBuilder();
        boolean first = true;

        for (NameValuePair pair : params)
        {
            if (first)
                first = false;
            else
                result.append("&");

            result.append(URLEncoder.encode(pair.getName(), "UTF-8"));
            result.append("=");
            result.append(URLEncoder.encode(pair.getValue(), "UTF-8"));
        }
        System.out.println(result.toString());
        return result.toString();
    }        
}

By not working I mean that no errors appear, but the PUT doesn't work, like when I use the ApacheHttpClient solution. What is wrong with my code?

Thanks.

Try calling urlConnection.getResponseCode(); after urlConnection.connect(); to force a flush of the underlying outputstream and reading the inputsream.

Try set

urlConnection.setRequestProperty("Content-type", "application/x-www-form-urlencoded"); 

after

urlConnection.setRequestMethod("PUT");

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM