2016-08-16 121 views
1

我是新来的Android和Web服务编程使用Java和我一直有问题连接我的Android应用程序到我的Java Web服务。 我已经在tomcat上部署了web服务,并且它正在连接到我的手机浏览器,但每次尝试从我的Android应用程序连接时,HttpClient都会返回null。REST风格的Web服务json响应在java中返回null

这是我的源代码。

public class ServiceHandler { 

static String response = null; 
public final static int GET = 1; 
public final static int POST = 2; 

public ServiceHandler() { 

} 

/** 
* Making service call 
* @url - url to make request 
* @method - http request method 
* */ 
public String makeServiceCall(String url, int method) { 
    return this.makeServiceCall(url, method, null); 
} 

/** 
* Making service call 
* @url - url to make request 
* @method - http request method 
* @params - http request params 
* */ 
public String makeServiceCall(String url, int method, List<NameValuePair> params) { 
    try { 
     // http client 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpEntity httpEntity = null; 
     HttpResponse httpResponse = null; 

     // Checking http request method type 
     if (method == POST) { 
      HttpPost httpPost = new HttpPost(url); 
      // adding post params 
      if (params != null) { 
       httpPost.setEntity(new UrlEncodedFormEntity(params)); 
      } 

      httpResponse = httpClient.execute(httpPost); 

     } else if (method == GET) { 
      // appending params to url 
      if (params != null) { 
       String paramString = URLEncodedUtils 
         .format(params, "utf-8"); 
       url += "?" + paramString; 
      } 
      HttpGet httpGet = new HttpGet(url); 

      httpResponse = httpClient.execute(httpGet); 

     } 
     httpEntity = httpResponse.getEntity(); 
     response = EntityUtils.toString(httpEntity); 

    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return response; 

} 

}

private class Authenticate extends AsyncTask<Void, Void, Void>{ 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     // Showing progress dialog 
     pDialog = new ProgressDialog(LoginActivity.this); 
     pDialog.setMessage("Please wait..."); 
     pDialog.setCancelable(false); 
     pDialog.show(); 
    } 

    @Override 
    protected Void doInBackground(Void... arg0) { 
     // Creating service handler class instance 
     ServiceHandler sh = new ServiceHandler(); 


     String url = "http://192.168.34.1:8080/SchoolWebService/rest/User/"+username+","+password; 

     // Making a request to url and getting response 
     String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET); 

     Log.d("Response: ", "> " + jsonStr); 

     if (jsonStr != null) { 
      try { 
       JSONObject c = new JSONObject(jsonStr); 

       String uname = c.getString("username"); 
       String pword = c.getString("password"); 
       snackbar.setText("Authenticated").show(); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } else { 
      snackbar.setText("Authentication Failed!").show(); 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     // Dismiss the progress dialog 
     if (pDialog.isShowing()) 
      pDialog.dismiss(); 
    } 
} 

的Log.d(....);语句总是返回null。

+0

除了使用的AsyncTask使用抽射解析JSON数据...... – Manish

+0

我如何不知道要做到这一点 – Charles

+0

我从我的代码做错了什么? – Charles

回答

0

谢谢你们,但我终于找到了解决方案。 @foobar评论说,makeServiceCall方法抛出了一个我没看到的异常,于是我拿出printStackTrace()并用Log.e(TAG,Log.getStackTraceString(e))取代它。然后我发现我的手机无法通过网络连接到我的电脑。我得到了连接拒绝错误消息。所以我做了以下事情。

  1. 打开手机上的USB共享。
  2. 从命令提示符键入ipconfig,并从我的USB连接192.168.42.xxx获得我的IPv4地址。
  3. 我用这个替换了我的URL中的IP地址。
  4. 我添加入站和出站规则,以我的防火墙在我的端口号,一切都开始工作

谢谢你们

1

你的服务器日志说什么?请求是否会将其发送到服务器?服务器机器上的Tcpdump或Wireshark跟踪将帮助您了解浏览器请求和Android请求的不同之处。

我很长时间没有直接使用HttpClinet。你应该考虑为你的http请求使用一个库。正如另一位用户所建议的,这是一个使用Volley的例子。

String username = "george"; 
    String password = "jetson"; 
    String url = "http://192.168.34.1:8080/SchoolWebService/rest/User/"+username+","+password; 

    Context appContext = InstrumentationRegistry.getTargetContext(); 
    RequestQueue queue = Volley.newRequestQueue(appContext); 

    StringRequest stringRequest = new StringRequest(Request.Method.GET, url, 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 

        Log.d("TAG", "success: " + response); 

       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 

     } 
    }); 

    queue.add(stringRequest); 

考虑使用摘要身份验证,在url中明文密码是不是一个很好的解决方案,即使它是一个学校项目。