HttpURLConnection的PUT方法不起作用
问题描述:
我已经做了以下的客户端应用程序消耗REST服务(一PUT方法)使用AppacheHttpClient(它的工作):HttpURLConnection的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解决方案。我的代码有什么问题?
谢谢。
答
尝试在urlConnection.connect();
之后调用urlConnection.getResponseCode();
强制刷新底层输出流并读取输入流。
答
尽量设置
urlConnection.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
后
urlConnection.setRequestMethod("PUT");
谢谢!它正在工作!你能告诉我什么操作来读取响应? PUT方法的结果? – user2144555 2013-03-27 15:29:27
我已经发现。我必须使用:'Scanner inStream = new Scanner(urlConnection.getInputStream());' – user2144555 2013-03-27 15:33:42
调用'urlconnection.getResponseMessage()'来读取与代码相关的HTTP消息。如果它是一个OK(200+),则可以使用'urlconnection.getInputStream()'或'urlconnection.getContent()'来读取主体,如果该内容有数据处理程序。如果您收到错误代码,请使用'urlconnection.getErrorStream()' – 2013-03-27 15:33:57