前一阵子,公司有个api接口必须使用put方式请求提交数据,但是在java中put方式的使用相当少,网上几乎很难找到相应的例子,摸索了一阵子,终于搞定了,下面分享给大家:
1、四种http请求方式作用
- POST /uri 创建
- DELETE /uri/xxx 删除
- PUT /uri/xxx 更新或创建
- GET /uri/xxx 查看
2、post和put的区别
PUT,DELETE操作是幂等的。所谓幂等是指不管进行多少次操作,结果都一样。比如我用PUT修改一篇文章,然后在做同样的操作,每次操作后的结果并没有不同,DELETE也是一样。顺便说一句,因为GET操作是安全的,所以它自然也是幂等的。
POST操作既不是安全的,也不是幂等的,比如常见的POST重复加载问题:当我们多次发出同样的POST请求后,其结果是创建出了若干的资源。
安全和幂等的意义在于:当操作没有达到预期的目标时,我们可以不停的重试,而不会对资源产生副作用。从这个意义上说,POST操作往往是有害的,但很多时候我们还是不得不使用它。
还有一点需要注意的就是,创建操作可以使用POST,也可以使用PUT,区别在于POST 是作用在一个集合资源之上的(/uri),而PUT操作是作用在一个具体资源之上的(/uri/xxx),再通俗点说,如果URL可以在客户端确定,那么就使用PUT,如果是在服务端确定,那么就使用POST,比如说很多资源使用数据库自增主键作为标识信息,而创建的资源的标识信息到底是什么只能由服务端提供,这个时候就必须使用POST。
3、最后上代码
public static String doPut(String id, String token) {
String ret = null;
try {
//跟HttpPost请求方式的代码差别并不大
HttpPut request = new HttpPut(DEV_URL); //关键是这句,DEV_URL为你的api接口地址
//添加参数
List<NameValuePair> values = new ArrayList<NameValuePair>();
values.add(new BasicNameValuePair("id", id));
values.add(new BasicNameValuePair("device_token", token));
// request.setHeader("Accept-Language", "zh-CN"); 这里可以设置一些请求头
// request.setHeader("Accept",
// "application/json, application/xml, text/html, text/*, image/*, */*");
DefaultHttpClient client = new DefaultHttpClient();
UrlEncodedFormEntity urlEntity = new UrlEncodedFormEntity(values,
"UTF-8");
request.setEntity(urlEntity);
HttpResponse response = client.execute(request);
if (response != null) {
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200 || statusCode == 403) {
HttpEntity entity = response.getEntity();
InputStream inputStream = entity.getContent();
if (inputStream != null) {
//这里我封装了一个读取输入流的工具类,大家可以自行处理
ret = StreamTools.readInputStream(inputStream);
inputStream.close();
}
}
}
} catch (Exception e) {
Debug_AdLog.e(e); //自己封装的调试日志类
}
return ret;
}
4.后话
现在安卓实际开发中网络请求基本都是用了第三方框架的,例如okhttp,volley等,这些框架对请求方式都兼容,所以并不会造成太大麻烦。以上只是本人使用比较原始的安卓网络请求HttpClient。