2016-08-16 4 views
1

Ich bin neu in Android und Web Services Programmierung mit Java und ich habe Probleme beim Verbinden meiner Android App mit meinem Java Web Service. Ich habe den Webdienst auf Tomcat bereitgestellt und es verbindet sich mit meinem Telefonbrowser, aber der HttpClient gibt jedes Mal null zurück, wenn ich versuche, eine Verbindung von meiner Android App herzustellen.RESTful Web Service JSON Antworten geben null in Java zurück

Hier ist mein Quellcode.

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(); 
    } 
} 

Die Log.d (....); Anweisung gibt immer null zurück.

+0

neben der Verwendung AsyncTask Volley verwenden JSON-Daten zu analysieren ... – Manish

+0

Ich habe keine Ahnung, wie man um das zu tun – Charles

+0

Was mache ich falsch aus meinem Code? – Charles

Antwort

0

Danke Jungs, aber ich habe endlich die Lösung gefunden. Als @foobar kommentierte, warf die makeServiceCall-Methode eine Ausnahme, die ich nicht sah, also nahm ich die printStackTrace() heraus und ersetzte sie durch Log.e (TAG, Log.getStackTraceString (e)); Dann habe ich herausgefunden, dass mein Telefon über das Netzwerk keine Verbindung zu meinem PC herstellen konnte. Ich habe eine Verbindung verweigert Fehlermeldung erhalten. Also habe ich folgende Dinge getan.

  1. Angeschaltetes USB-Tethering auf meinem Telefon.
  2. Tippte ipconfig von der Eingabeaufforderung und bekam meine IPv4-Adresse von meiner USB-Verbindung 192.168.42.xxx.
  3. Ich ersetzte die IP-Adresse in meiner URL mit diesem.
  4. I hinzugefügt Inbound- und Outbound-Regeln zu meiner Firewall auf meiner Portnummer und alles begann
  5. Arbeits

Danke Jungs

1

Was sagen Ihre Serverprotokolle? Erfüllt die Anfrage sogar den Server? Ein Tcpdump- oder ein Wireshark-Trace auf dem Servercomputer würde Ihnen helfen, zu sehen, was sich von der Browseranfrage und der Android-Anfrage unterscheidet.

Ich habe HttpClinet nicht direkt in ziemlich viel Zeit verwendet. Sie sollten in Erwägung ziehen, eine Bibliothek für Ihre http-Anfragen zu verwenden. Hier ist ein Beispiel, das Volley verwendet, wie ein anderer Benutzer vorgeschlagen hat.

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); 

Betrachten Auth, Passwörter im Klartext in der URL verdauen sind nicht eine große Lösung, auch wenn sie ein Schulprojekt.

Verwandte Themen