HttpUrlConnection PUT方法不起作用

时间:2013-03-27 15:06:51

标签: java web-services rest httpurlconnection restful-architecture

我使用 AppacheHttpClient 完成了以下客户端应用程序来使用REST服务(一种PUT方法)(它正在工作):

    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();
        }
    }
}

现在我想使用 HttpUrlConnection 做同样的事情,但是无法正常工作:

    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();
    }        
}

通过不工作我的意思是没有错误出现,但PUT不起作用,就像我使用ApacheHttpClient解决方案一样。我的代码出了什么问题?

感谢。

2 个答案:

答案 0 :(得分:1)

尝试在urlConnection.getResponseCode();之后调用urlConnection.connect();来强制刷新基础输出流并读取输入流。

答案 1 :(得分:0)

尝试设置

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

之后

urlConnection.setRequestMethod("PUT");