此处将为大家介绍关于Android-REST/JSON客户端的事实上的实现?的详细内容,并且为您解答有关androidrestful的相关问题,此外,我们还将为您介绍关于AndroidReST基于客户
此处将为大家介绍关于Android-REST / JSON客户端的事实上的实现?的详细内容,并且为您解答有关android restful的相关问题,此外,我们还将为您介绍关于Android ReST 基于客户端和SOAP服务器,可能吗?、Android RESTful客户端、android rest客户端不支持的媒体类型、Android 分析android 客户端保持session 不过期的方式的有用信息。
本文目录一览:- Android-REST / JSON客户端的事实上的实现?(android restful)
- Android ReST 基于客户端和SOAP服务器,可能吗?
- Android RESTful客户端
- android rest客户端不支持的媒体类型
- Android 分析android 客户端保持session 不过期的方式
Android-REST / JSON客户端的事实上的实现?(android restful)
我是Android开发的新手,想知道是否有针对REST / JSON客户端实施的实际解决方案。似乎大多数Android开发人员都是基于Apache
HTTP客户端+ GSON或org.json编写自己的实现。我不喜欢手动编写所有这些代码的想法-我有什么可以用来不重新发明自行车的?
答案1
小编典典在寻找答案四个小时之后,我决定使用CRest- http:
//crest.codegist.org/index.html 。似乎是我要找的东西。
更新资料
1.5年后,我仍然认为这是一个很好的解决方案。
Android ReST 基于客户端和SOAP服务器,可能吗?
我正在写Android的web-service,客户端用的是Java,计划使用ReST,但服务器支持SOAP,JMS,和RMI(Remote Method Invocation )。
我想知道从服务器返回响应给基于客户端的ReST,这可能吗?
我所了解的,ReST不是像SOAP的协议,我可以这么操作嘛?
非常感谢。
Android RESTful客户端
我有一个RESTful Web服务,我想从Android访问它.
public class AndroidClientActivity extends Activity {
private EditText text;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
text = (EditText) findViewById(R.id.editText1);
}
public void myClickHandler(View view){
switch (view.getId()) {
case R.id.button1:
MyClient c = new MyClient();
c.execute(text);
break;
}
}
}
public class MyClient extends AsyncTask<EditText, Integer, String> {
protected String doInBackground(EditText... strings) {
WebResource wbr;
Client client = Client.create();
wbr = client.resource("http://my.ip.address:8080/MazeService/rest/service/hello");
String result = wbr.queryParam("number", "10").accept(MediaType.APPLICATION_JSON).get(String.class);
strings[0].setText(result);
return result;
}
protected void onProgressUpdate(Integer... progress) {
}
protected void onPostExecute(Long result) {
}
}
我在LogCat中获得此stacktrace:
02-09 00:06:38.593: E/AndroidRuntime(795): Caused by: java.lang.NullPointerException
02-09 00:06:38.593: E/AndroidRuntime(795): at javax.ws.rs.core.MediaType.valueOf(MediaType.java:119)
02-09 00:06:38.593: E/AndroidRuntime(795): at com.sun.jersey.api.client.ClientResponse.getType(ClientResponse.java:615)
02-09 00:06:38.593: E/AndroidRuntime(795): at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:532)
02-09 00:06:38.593: E/AndroidRuntime(795): at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:506)
02-09 00:06:38.593: E/AndroidRuntime(795): at com.sun.jersey.api.client.WebResource.handle(WebResource.java:674)
02-09 00:06:38.593: E/AndroidRuntime(795): at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
02-09 00:06:38.593: E/AndroidRuntime(795): at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:503)
02-09 00:06:38.593: E/AndroidRuntime(795): at com.maze.client.MyClient.doInBackground(MyClient.java:19)
02-09 00:06:38.593: E/AndroidRuntime(795): at com.maze.client.MyClient.doInBackground(MyClient.java:1)
02-09 00:06:38.593: E/AndroidRuntime(795): at android.os.AsyncTask$2.call(AsyncTask.java:264)
02-09 00:06:38.593: E/AndroidRuntime(795): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
02-09 00:06:38.593: E/AndroidRuntime(795): ... 5 more
问题出在哪儿?
解决方法:
我认为您正在尝试从doInBackground方法访问UI线程,但这样做不是一个好地方,而是像这样更改onPostExecute方法中的文本,您可以像这样安全地访问ui线程
首先将您的AsyncTask类定义为Activity类中的私有类
private class MyClient extends AsyncTask<EditText, Void, String> {
protected String doInBackground(EditText... strings) {
WebResource wbr;
Client client = Client.create();
wbr = client.resource("http://my.ip.address:8080/MazeService/rest/service/hello");
String result = wbr.queryParam("number", "10").accept(MediaType.APPLICATION_JSON).get(String.class);
return result;
}
protected void onPostExecute(String result) {
if(result != null)
text.setText(result);
}
}
然后从onPostExecute访问UI线程
请注意,您正在为onPostExecute定义Long参数,这是错误的,因为您将其定义为在AsyncTask定义中采用String类
android rest客户端不支持的媒体类型
415 Unsupported Media Type.
客户代码:
public JSONtest() throws Exception,IOException{ HttpPost request = new HttpPost(AppServerIP); JSONObject param = new JSONObject(); param.put("name","weiping"); param.put("password","123456"); StringEntity se = new StringEntity(param.toString()); request.setEntity(se); HttpResponse httpResponse = new DefaultHttpClient().execute(request); String retSrc = EntityUtils.toString(httpResponse.getEntity()); System.out.println(httpResponse.getStatusLine().getReasonPhrase()); }
服务器的代码:
public class resource { @POST @Path("/trigger") @Consumes(MediaType.APPLICATION_JSON) public Response trigger(JSONObject notify) throws Exception{ return Response.status(Response.Status.OK).entity("134124").tag("213q").type(MediaType.APPLICATION_JSON).build(); }
解决方法
在客户端代码中尝试这样的事情:
request.setHeader(“Content-Type”,“application / json”);
Android 分析android 客户端保持session 不过期的方式
最近遇到个问题,和朋友讨论小电商如何保持session不过期的问题,因为通常我们很多客户端是session是做成永久不过期的方式,只有重新登录了,生成新的session给客户端,电商因为同时如果几个端一起登录,同时又购买同一个物品的时候,可能就会出现奇奇怪怪的问题,比如死锁,数据金额可能异常各种问题,所以需要做一个session会过期的登录方式,比如你ios登录了,安卓端就需要被踢出来,总结和分析了看有如下三种方式:
最后我们默认是会选第二或第三种方式会比较可行。
首先要知道session和cookie,session是存在服务器的的用来区分不同的会话的,是一种服务器机制,cookie 是客户端登陆服务器以后,服务器需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否包含了一个session标识-称为session id,如果已经包含一个session id则说明以前已经为此客户创建过session,服务器就按照session id把这个session检索出来使用.如果客户请求不包含session id,则为此客户创建一个session并且生成一个与此session相关联的session id,这个session id将在本次响应中返回给客户端保存。
一般开源的框架都会把这个session_id 存贮在cookie中,注意这个session_id是会话的标识。不要直接明文存储。
回归正题,客户端登录时,将用户名,密码加密存贮在本地。同时将将cookie(或者session_id)保存起来,下次访问服务器是,把它带上,服务器端就能识别你已经登陆过了,但是我们知道服务器的session 是有时间限制的,默认是如果客户端20分钟以内没有访问服务器,这个session_id就过期了,在服务器端不存在了,但是客户端可能还认为自己没有掉线。怎么解决这个问题呢?
方案1、将session 设置成拥挤不过期,这样确实可以解决客户端的session 过期的问题,但是不推荐。这样服务器端session一直不销毁,会占用内存,越来越来越多。
方案2.心跳机制。这是最常见的客户端保持会话不过期的方法。简单的做法就是写个定时器,美隔几分钟发送广播,收到广播后收客户端去访问服务器。当然也有问题。这个方式。举个例子说下他的问题吧。比如虽然写了个定时器去访问服务器,但是如果这段时间(假如30分钟),客户端正好把网络给关了,31分钟后客户端又打开了网络连接,由于30分钟没有访问服务器 你调用A()方法的时候返回的结果是{“error”:"login"},然后你根据结果再去调用B() 登陆方法,登陆成功后,在自动A()方法。这样的话,每次访问网络都要更这个B()登陆方法,代码臃肿。而且费电。
方法3:服务器自动登登陆的方法
客户端访问服务器事,同时带着用户名,和密码,还有cookie(session_id),服务器先判断session_id 是否过期,如果过期,在判读参数中有用户名和密码,如果有,就在调用一下登录的方法,登录成功后,就接着操作。。这种方法的缺点就是每次都要带个账号和密码,稍微有点耗流量。
参考原文地址:http://www.th7.cn/Program/Android/201502/392240.shtml
今天的关于Android-REST / JSON客户端的事实上的实现?和android restful的分享已经结束,谢谢您的关注,如果想了解更多关于Android ReST 基于客户端和SOAP服务器,可能吗?、Android RESTful客户端、android rest客户端不支持的媒体类型、Android 分析android 客户端保持session 不过期的方式的相关知识,请在本站进行查询。
本文标签: