我使用 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解决方案一样。我的代码出了什么问题?
感谢。
答案 0 :(得分:1)
尝试在urlConnection.getResponseCode();
之后调用urlConnection.connect();
来强制刷新基础输出流并读取输入流。
答案 1 :(得分:0)
尝试设置
urlConnection.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
之后
urlConnection.setRequestMethod("PUT");