2014-06-23 6 views
0

안녕하세요. 현재 PHP에서 Android 기기로 JSON 객체를 보내는데 문제가 있습니다. 다른 사람과 전에이 작업을 수행했지만 제대로 작동했지만 이제는 작동하지 않습니다.PHP에서 Android로 JSON 게시

간단한 로그인 스크립트입니다. 입력 한 로그인 이메일과 비밀번호가 올바른지 여부에 따라 사용자의 데이터를 반환하거나 "false"를 반환해야합니다.

응답은 브라우저에서 시도했지만 내 동료에 따르면 안드로이드 개발 컴퓨터에서 볼 때 빈 배열을 얻습니다.

<?php 
    include('config.php'); 
    include('functions.php'); 
    include('password_hash_lib/password.php'); 

    if (!isset($_REQUEST["device"])) 
    { 
     $Email = $_POST['Email']; 
     $Password = $_POST['Password']; 
     try 
     { 
      if (authenticate($Email, $Password)) 
      { 
       echo "true"; 
      } 
      else { 
       echo "false"; 
      } 
     } 
     catch (Exception $e) 
     { 
      echo $e->getMessage(); 
     } 
    } 
    else if (isset($_REQUEST["device"])) 
    { 
     $device = $_REQUEST['device']; 
     $Email = $_REQUEST['email']; 
     $Password = $_REQUEST['password']; 

     if ($device == 'mobi') 
     { 
      try 
      { 
       if (authenticate($Email, $Password)) 
       { 
        $curruser = explode("+", $_SESSION['sess_user_auth']); 

        $arr = new ArrayObject(Array(), ArrayObject::STD_PROP_LIST); 
        $arr->userid = $curruser[0]; 
        $arr->email = $curruser[1]; 
        $arr->fullname = $curruser[2]; 
        $arr->displaypic = $curruser[3]; 
        $arr->displayname = $curruser[4]; 

        echo str_replace("\\", "", json_encode((object) $arr));   
       } 
       else { 
        echo "false"; 
       } 
      } 
      catch (Exception $e) 
      { 
       echo $e->getMessage(); 
      } 
     } 
    } 

?> 

이 내 동료가 쓴 안드로이드 코드 :

@Override 
protected Boolean doInBackground(Void... params) { 
// TODO Auto-generated method stub 
boolean status=false; 
LoginMgr lmgr=new LoginMgr(getSherlockActivity().getBaseContext()); 
try { 
HttpClient httpclient= new DefaultHttpClient(); 
HttpGet httpget=new HttpGet("http://www.xxxxx.com/login.php?device=mobi&[email protected]&password=xxxxxxx 

"); 
HttpResponse response= httpclient.execute(httpget); 
int statuscode=response.getStatusLine().getStatusCode(); 
if(statuscode==200){ 
InputStream is=response.getEntity().getContent(); 
BufferedReader br=new BufferedReader(new InputStreamReader(is)); 
final StringBuilder stringbuild= new StringBuilder(); 
String curr_line; 
if((curr_line=br.readLine())!=null){ 
stringbuild.append(curr_line); 
String jsonstr=stringbuild.toString(); 
getSherlockActivity().runOnUiThread(new Runnable() { 
@Override 
public void run() { 
// TODO Auto-generated method stub 
Toast.makeText(getSherlockActivity(), stringbuild.toString(), Toast.LENGTH_LONG).show();  
} 
}); 
if(!jsonstr.equalsIgnoreCase("false")){ 
JSONObject job=new JSONObject(jsonstr); 
String str=job.getString("3").replace("\\/","/"); 
String image="http://www.xxxxx.com/img/timthumb.php?&h=50&w=50&src= 

"+str; 
lmgr.loginUser(new Login(job.getString("0"),job.getString("4"),job.getString("1"),image)); 
status=true; 
JSONObject job=new JSONObject(jsonstr); 
if(job.getString("success").equalsIgnoreCase("1")){ 
lmgr.loginUser(new Login(job.getString("userid"),job.getString("username"),job.getString("useremail"),job.getString("userimage"))); 
status=true; 
} 
} 
} 
} catch (ClientProtocolException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} catch (IOException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} catch (JSONException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 
return status; 
} 

내가 대신 내 코드에서 에코의 복귀를 사용하여 시도했다가하지만 여전히 작동하지 않았다

은 PHP 코드입니다 . 빈 배열 만 오류가 없습니다.

+0

왜 json_encode에서 백 슬래시를 제거 하시겠습니까? – colburton

+0

반환 된 배열에 url이 있기 때문에 json_encode는 백 슬래시를 추가하여 특정 문자를 이스케이프 처리합니다. –

+1

하지만 더 이상 유효하지 않습니다. 더 이상 디코딩 할 수 없습니다. – colburton

답변

1

이이 문제를 해결해야한다. 스크립트가 반환하는 내용에 일관성을 유지하십시오. 실패하더라도 항상 같은 종류의 데이터 (JSON)를 반환해야합니다.

<?php 
include('config.php'); 
include('functions.php'); 
include('password_hash_lib/password.php'); 

if (!isset($_REQUEST["device"])) 
{ 
    $Email = $_POST['Email']; 
    $Password = $_POST['Password']; 
    try 
    { 
     if (authenticate($Email, $Password)) echo json_encode(array('auth' => true)); 
     else echo json_encode(array('auth' => false)); 
    } 
    catch (Exception $e) 
    { 
     echo json_encode(array('error' => $e->getMessage())); 
    } 
} 
else if (isset($_REQUEST["device"])) 
{ 
    $device = $_REQUEST['device']; 
    $Email = $_REQUEST['email']; 
    $Password = $_REQUEST['password']; 

    if ($device == 'mobi') 
    { 
     try 
     { 
      if (authenticate($Email, $Password)) 
      { 
       $curruser = explode("+", $_SESSION['sess_user_auth']); 

       $json = array(); 
       $json['userid'] = $curruser[0]; 
       $json['email'] = $curruser[1]; 
       $json['fullname'] = $curruser[2]; 
       $json['displaypic'] = $curruser[3]; 
       $json['displayname'] = $curruser[4]; 
       echo json_encode($json);   
      } 
      else 
      { 
       echo json_encode(array('auth' => false)); 
      } 
     } 
     catch (Exception $e) 
     { 
      echo json_encode(array('error' => $e->getMessage())); 
     } 
    } 
} 

편집 : 당신의 마지막 업데이트를 기반으로 , 당신은 당신의 안드로이드 코드에서 몇 가지 실수를 가지고있다. 나는 그것을 향상 시키려고 노력했지만 그것을 테스트하지는 않았다.

@Override 
protected Boolean doInBackground(Void... params) 
{ 
    boolean status = false; 
    LoginMgr lmgr = new LoginMgr(getSherlockActivity().getBaseContext()); 
    try 
    { 
     // Connect to the remote server 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpGet httpget = new HttpGet("http://www.xxxxx.com/login.php?device=mobi&[email protected]&password=xxxxxxx"); 
     HttpResponse response = httpclient.execute(httpget); 
     int statuscode=response.getStatusLine().getStatusCode(); 
     if(statuscode==200) 
     { 
      // Read response 
      InputStream is = response.getEntity().getContent(); 
      BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
      final StringBuilder stringbuild= new StringBuilder(); 
      String curr_line = null; 
      while ((curr_line = br.readLine()) != null) 
      { 
       stringbuild.append(curr_line); 
      } 

      getSherlockActivity().runOnUiThread(new Runnable() { 
       @Override 
       public void run() 
       { 
        Toast.makeText(getSherlockActivity(), stringbuild.toString(), Toast.LENGTH_LONG).show();  
       } 
      }); 

      // Parse response to JSON 
      JSONObject json = new JSONObject(stringbuild.toString()); 
      if (json.has("auth")) 
      { 
       if (json.getBoolean("auth")) 
       { 
        // Authentificate with success 
        getSherlockActivity().runOnUiThread(new Runnable() { 
         @Override 
         public void run() 
         { 
          Toast.makeText(getSherlockActivity(), "Success", Toast.LENGTH_LONG).show();  
         } 
        }); 
       } 
       else 
       { 
        // In this case, authentification has failed 
        getSherlockActivity().runOnUiThread(new Runnable() { 
         @Override 
         public void run() 
         { 
          Toast.makeText(getSherlockActivity(), "Wrong user credentials", Toast.LENGTH_LONG).show();  
         } 
        }); 
       } 
      } 
      else if (json.has("userid")) 
      { 
       String userid = json.getString("userid"); 
       String email = json.getString("email"); 
       String fullname = json.getString("fullname"); 
       String displaypic = json.getString("displaypic").replace("\\/","/"); 
       String displayname = json.getString("displayname"); 

       // In this case, we got some data about the user 
       String image = "http://www.xxxxx.com/img/timthumb.php?&h=50&w=50&src=" + displaypic; 
       lmgr.loginUser(new Login(json.getString("0"), json.getString("4"), json.getString("1"), image)); 
       status = true; 
       JSONObject job = new JSONObject(jsonstr); 
       if(job.getString("success").equalsIgnoreCase("1")) 
       { 
        lmgr.loginUser(new Login(userid, fullname, email, displaypic)); 
        status = true; 
       } 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

    return status; 
} 
+0

제발이 문제가 해결되지 않았습니다. –

+0

Android 코드를 게시하십시오. – Manitoba

+0

방금 ​​요청한대로 내 게시물을 편집하고 android 스크립트를 추가했습니다. –

0

은 교체 : echo str_replace("\\", "", json_encode((object) $arr));

이 작성자 : echo json_encode(array('user'=>$arr));

+0

이 문제는 불행히도 해결되지 않았습니다. –

0

비슷한 문제가있어서 HttpGet을 HttpPost로 변경했습니다. 희망이

관련 문제