2017-02-06 9 views
0

私のウェブサーバーからJSONポストを認証し、レスポンス$response['success']または$response['error']に基づいて認証を行う必要があるアプリケーションをビルドしようとしています。 WebサーバーはPHPであり、POSTが正しく入っていることを知っています。私が問題を抱えているのは、応答を読み取ることです。今、私は次のコードを使用していますが、それは私にエラーを与える:アンドロイドのjsonポストへの応答を処理する方法

Javaコード(アプリ)

protected Boolean doInBackground(Void... params) { 
     // TODO: attempt authentication against a network service. 


     OutputStream os = null; 
     InputStream is = null; 
     HttpURLConnection conn = null; 
     boolean returnvalue = false; 
     try { 
      // Simulate network access. 
      // TODO: send username/password to https://svlo.scoutingvictorie.nl/android.php 
      // if return == true login 
      // else error. 
      // constants 
      URL url = new URL("https://victorie.stienos.nl/android.php"); 
      JSONObject jsonObject = new JSONObject(); 
      jsonObject.put("action", "LogIn"); 
      jsonObject.put("username", mEmail); 
      jsonObject.put("password", mPassword); 
      String message = jsonObject.toString(); 

      conn = (HttpURLConnection) url.openConnection(); 
      conn.setReadTimeout(10000 /*milliseconds*/); 
      conn.setConnectTimeout(15000 /* milliseconds */); 
      conn.setRequestMethod("POST"); 
      conn.setDoInput(true); 
      conn.setDoOutput(true); 
      conn.setFixedLengthStreamingMode(message.getBytes().length); 

      //make some HTTP header nicety 
      conn.setRequestProperty("Content-Type", "application/json;charset=utf-8"); 
      conn.setRequestProperty("X-Requested-With", "XMLHttpRequest"); 

      //open 
      conn.connect(); 

      //setup send 
      os = new BufferedOutputStream(conn.getOutputStream()); 
      os.write(message.getBytes()); 
      //clean up 
      os.flush(); 

      // do something with response 
      is = conn.getInputStream(); 
      JsonReader reader = new JsonReader(new InputStreamReader(is, "UTF-8")); 
      List<Message> messages = new ArrayList<Message>(); 
      reader.beginArray(); 
      while (reader.hasNext()) { 
       String text = null; 

       reader.beginObject(); 
       while (reader.hasNext()) { 
        String name = reader.nextName(); 
        if (name.equals("success")) { 
         text = reader.nextString(); 
         if(text.equals('1')){ 
          returnvalue = true; 
         } 
        } else { 
         reader.skipValue(); 
        } 
       } 
       reader.endObject(); 
      } 
      reader.endArray(); 

      // String contentAsString = readIt(is,len); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 


     /* 
     finally { 
      //clean up 
      try { 
       os.close(); 
       is.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      conn.disconnect(); 
     } 
     for (String credential : DUMMY_CREDENTIALS) { 
      String[] pieces = credential.split(":"); 
      if (pieces[0].equals(mEmail)) { 
       // Account exists, return true if the password matches. 
       return pieces[1].equals(mPassword); 
      } 
     }*/ 

     return returnvalue; 
    } 

returnvalueは、応答が、他の場合は偽の成功、ある場合はtrueにする必要があります。

エラー

02-06 15:18:11.194 5037-5201/nl.stienos.svlo E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2 
                  Process: nl.stienos.svlo, PID: 5037 
                  java.lang.RuntimeException: An error occurred while executing doInBackground() 
                   at android.os.AsyncTask$3.done(AsyncTask.java:309) 
                   at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
                   at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
                   at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
                   at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
                   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
                   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
                   at java.lang.Thread.run(Thread.java:818) 
                  Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT 
                   at android.util.JsonReader.expect(JsonReader.java:310) 
                   at android.util.JsonReader.beginArray(JsonReader.java:277) 
                   at nl.stienos.svlo.LoginActivity$UserLoginTask.doInBackground(LoginActivity.java:360) 
                   at nl.stienos.svlo.LoginActivity$UserLoginTask.doInBackground(LoginActivity.java:303) 
                   at android.os.AsyncTask$2.call(AsyncTask.java:295) 
                   at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                   at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)  
                   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)  
                   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)  
                   at java.lang.Thread.run(Thread.java:818)  

PHPファイル

<?php 

include_once 'backend/functions/android_app.php'; 

error_log("JSON SUCCESS"); 
$json = file_get_contents('php://input'); 
$obj = json_decode($json); 
$action = $obj->{'action'}; 

$response = array(); 

if($action == 'LogIn'){ 
    $username = $obj->{'username'}; 
    $password = $obj->{'password'}; 

    if(AppLogIn($username, $password)){ 
     $response["success"] = 1; 
    } 
    else{ 
     $response["error"] = 1; 
    } 
    echo json_encode($response); 

} 

は、誰かが私を助けることを願って!

+0

「echo json_encode($ response、true);」を試してください。実際にはオブジェクト形式で取得していますが、配列として解析しています。 –

+0

私は代わりにボレーを使用したでしょう –

答えて

1

はこれを試してください。..

BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); 
     String inputLine; 
     StringBuffer response = new StringBuffer(); 

     while ((inputLine = in.readLine()) != null) { 
      response.append(inputLine); 
     } 
     in.close(); 
     String bufferString = response.toString(); 

     JSONObject json = new JSONObject(bufferString); 
     String success = json.getString("success"); 

実際にあなたがオブジェクトの形でそれを取得しますが、配列として解析しています。

関連する問題