问 题
I have a Python/Django server that is the API for a web service.
I'm building an Android application that will communicate with the API and authenticate users, and enable them do all pulls/pushes from the server.
My trouble is with the particular communication with the server. Currently I use my WiFi network, and run the server like so python manage.py runserver 192.168.1.3:8000 so that it is available to any test device on my LAN.
The API is written so it returns http status messages with every response, so that I can tell the success or failure of a request before parsing the JSON reply.
On my Android side, I have used HttpURLConnection because it has the getHeaderField(null) method that I use to pick the http status message from the response. I get a status message 200 [success] when I 'ping' my server - this is a sort-of proof of concept.
My real issue is authentication. My API requires I send it a JSON with data, and it returns a JSON response [with an http status message in the head].
I can't seem to figure out how to do this. The JSON action I've seen around the interwebs are merely picking, or posting.
I am wondering how I can POST and pick up a response from the server.
Extra information
- Server supports HEAD and GET and OPTIONS.
- Assuming server home is 192.168.1.3, user login/register would be in 192.168.1.3/user, events would be in 192.168.1.3/events and so on..
- This was the closest I got to figuring out a solution, but not quite..
CODE from the AsyncTask
protected JSONObject doInBackground(String... params) { publishProgress(true); /*Create a new HttpClient and Post Header*/ JSONObject result=null; HttpClient httpclient = new DefaultHttpClient(); try { URL url = new URL(cons.PROTOCOL,cons.SERVER,cons.PORT,"/user"); HttpPost httppost = new HttpPost(url.toURI()); HttpResponse response =null; /*Add your data*/ JSONObject j1=new JSONObject(); JSONObject json=new JSONObject(); j1.put("username", "test"); j1.put("email","test@test.com"); j1.put("password","password"); j1.put("first_name","John"); j1.put("last_name","Doe"); json.put("user",j1); json.put("mobile_number","256774622240"); StringEntity se = new StringEntity( json.toString()); se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); httppost.setEntity(se); /*Execute HTTP Post Request*/ response= httpclient.execute(httppost); Log.i("jazz","It's ALIVE!!!!!"); Log.i("jazz",response.getStatusLine().toString()); } catch (ClientProtocolException e) { /* TODO Auto-generated catch block*/ } catch (IOException e) { // TODO Auto-generated catch block } catch (URISyntaxException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return result; }解决方案
Okay, so I'm now answering my own question :D
The issue was with the path variable in the URL string.
This is the format of one of the URL constructors based on this document.
URL(String protocol, String host, int port, String file)
Since I am posting the JSON to the /user path, that's the one I insert into the constructor as the directory.
So, my URL was formed like so:
URL url= new URL("http",cons.SERVER,cons.PORT,"/user/");
My mistake in the beginning was using /user instead of /user/ but other than that, the URL structure and connections are all alright.
本文地址:IT屋 » Android authentication using JSON
问 题
我有一个Python / Django服务器,这是一个Web服务的API。我正在构建一个Android应用程序,它将与API进行通信并对用户进行身份验证,并使其能够执行所有拉/从服务器推送。
我的问题是与服务器的特定通信。目前,我使用我的WiFi网络,并运行服务器像 python manage.py runserver 192.168.1.3:8000 ,以便它可用于我的LAN上的任何测试设备。 / p>
API被写入,因此每个响应都返回 http状态消息,以便在解析请求之前告诉成功或失败JSON回复
在我的Android端,我使用了 HttpURLConnection ,因为它有 getHeaderField )方法,我用来从响应中选择 http状态消息。当我'ping'我的服务器时,我得到一个状态信息 200 [成功] - 这是一种概念证明。
我的真正的问题是认证。我的API需要我发送一个带有数据的JSON,并返回一个JSON响应[在头部有一个http状态消息]。
我似乎无法弄清楚如何做到这一点。我在interwebs周围看到的JSON操作只是选择或发布。
我想知道如何POST,并从服务器上提取响应。
额外的信息
- 服务器支持HEAD和GET和OPTIONS。
- 假设服务器的主目录是192.168.1.3,用户登录/注册将在192.168.1.3/user中,事件将在192.168.1.3/events等等。
- 这是最接近我找到一个解决方案,但不完整。
AsyncTask中的代码
protected JSONObject doInBackground(String ... params){
publishProgress(true);
/ *创建一个新的HttpClient和Post Header * /
JSONObject result = null;
HttpClient httpclient = new DefaultHttpClient();
try {
URL url = new URL(cons.PROTOCOL,cons.SERVER,cons.PORT,“/ user”);
HttpPost httppost = new HttpPost(url.toURI());
HttpResponse response = null;
/ *添加您的数据* /
JSONObject j1 = new JSONObject();
JSONObject json = new JSONObject();
j1.put(“username”,“test”);
j1.put(“email”,“test@test.com”);
j1.put(“password”,“password”);
j1.put(“first_name”,“John”);
j1.put(“last_name”,“Doe”);
json.put(“user”,j1);
json.put(“mobile_number”,“256774622240”);
StringEntity se = new StringEntity(json.toString());
se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE,“application / json”));
httppost.setEntity(se);
/ *执行HTTP Post Request * /
response = httpclient.execute(httppost);
Log.i(“jazz”,“它是ALIVE !!!!!”);
Log.i(“jazz”,response.getStatusLine()。toString());
} catch(ClientProtocolException e){
/ * TODO自动生成的catch块* /
} catch(IOException e){
// TODO自动生成catch块
} catch(URISyntaxException e){
// TODO自动生成的catch块
e.printStackTrace();
} catch(JSONException e){
// TODO自动生成的catch块
e.printStackTrace();
}
返回结果;
}
解决方案
现在回答我自己的问题:D
问题是与路径变量在 URL字符串。
这是基于这个文档。
URL(String protocol,String host,int port,String file)