Android API Post Request с необработанным JSONObject возвращает ошибку - PullRequest
0 голосов
/ 11 марта 2020

Я занимаюсь разработкой android приложения. Я пытаюсь отправить данные на сервер с помощью запроса Post. Я посылаю JsonObject как необработанный параметр тела. Вот мой код.

final NetworkInfo networkInfo = connectivityManager
            .getActiveNetworkInfo();
    final OkHttpClient okHttpClient = new OkHttpClient();
    okHttpClient.setReadTimeout(60, TimeUnit.SECONDS);
    okHttpClient.setConnectTimeout(60, TimeUnit.SECONDS);
    RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint(Constants.END_POINT)
            .setClient(new OkClient(okHttpClient)).setLogLevel(RestAdapter.LogLevel.FULL).build();

    api = restAdapter.create(API.class);
    if (networkInfo != null && networkInfo.isConnected()) {
        try {
            List<Contacts> sContacts = ContactDatabase
                    .getDatabase(context.getApplicationContext())
                    .contactsDao()
                    .getunlistedContacts("false");

            JSONArray mContactList = new JSONArray();
            for (int i = 0; i < sContacts.size(); i++) {
                try {
                    Contacts obj = sContacts.get(i);
                    Gson gson = new Gson();
                    JSONObject contactJsonObject = new JSONObject(gson.toJson(obj));
                    Log.e("ContactObject++", contactJsonObject.toString());
                    mContactList.put(contactJsonObject);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
            JSONObject mContactsJsonObject = new JSONObject();
            mContactsJsonObject.put("contact_list", mContactList);
            mContactsJsonObject.put(Constants.APIKeys.DEVICE_ID, context.getSharedPreference(Constants.SharedKey.DEVICE_ID));
            mContactsJsonObject.put(Constants.APIKeys.ID, context.getSharedPreference(Constants.SharedKey.USER_ID));
            JSONObject mJsonObject = new JSONObject(api.checkContacts(mContactsJsonObject).toString());
            if (mJsonObject.getBoolean(Constants.APIKeys.STATUS)) {
                JSONArray mUserListJsonArray = mJsonObject.getJSONArray(Constants.APIKeys.USER_LIST);
                for (int i = 0; i < mUserListJsonArray.length(); i++) {
                    JSONObject mUserJsonObject = mUserListJsonArray.getJSONObject(i);
                    String ContactId = mUserJsonObject.getString(Constants.APIKeys.LOCAL_ID);
                    Contacts mContacts = ContactDatabase
                            .getDatabase(context)
                            .contactsDao()
                            .getUserById(ContactId);
                    JSONObject userData = mUserJsonObject.getJSONObject(Constants.APIKeys.USER_DETAILS);
                    mContacts.setUserid(userData.getString(Constants.APIKeys.ID));
                    mContacts.setUserName(userData.getString(Constants.APIKeys.USERNAME));
                    mContacts.setImage(userData.getString(Constants.APIKeys.USER_IMAGE));
                    mContacts.setStatus(userData.getString(Constants.APIKeys.STATUS));
                    if (!mContacts.getPhone().equalsIgnoreCase(context.getSharedPreference(Constants.SharedKey.PHONE))) {
                        ContactDatabase.getDatabase(context.getApplicationContext())
                                .contactsDao()
                                .updateContacts(mContacts);
                    }
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

И интерфейс API класса

@POST("/check_Contacts")
JsonObject checkContacts(@Body JSONObject mJsonObject);

И мой код PHP

public function check_Contacts(){
    $this->load->database();
    $this->load->model('User_Model');
    $this->load->model('Contact_Model');
    $postdata = file_get_contents("php://input");
    $phone='';
    $name='';
    $device_id='';
    $JsonData='';
    $contactArray;
    $JsonData=json_decode($postdata,true);
    $contactArray=$JsonData[contactList];
    $device_id=$JsonData[deviceId];
    $user_id=$JsonData[userid];
    if($this->User_Model->checkDevice($user_id,$device_id))
    {
        $arr = [];
        foreach ($contactArray as $contactObject) {
            $id=$contactObject[userid];
            $name=$contactObject[name];
            $phone=$contactObject[phone];
            if($this->User_Model->phone_exists($phone))
            {
                $user_exist=true;
                $Status=true;
                $StatusCode=Success;
                $userData=$this->User_Model->getUser($phone);
                $user['user_data']=$userData;
                $user['local_id']=$id;
                $user['user_status']=true;
                $arr[]=$user;
                $user_status=1;
                if($this->Contact_Model->checkContact($user_id, $phone)){
                    $user_status=0;
                    $user_exist=true;
                    $message="User exists with the provided no.";
                    $StatusCode=user_exist;
                    $Status=true;

                }else{
                    $this->Contact_Model->addContact($user_id, $phone, $name, $user_status);
                }
            }else
            {
                $user_status=0;
                $this->Contact_Model->addContact($user_id, $phone, $name, $user_status);
                $user_exist=false;
                $message="No User with the provided no.";
                $StatusCode=user_not_exist;
                $Status=true;
            }
        }
        $result[contactList]=$arr;
        $Status=true;
        $StatusCode=Success;
    }else
    {
        $message="Invalid device";
        $StatusCode=invalid_parameter;
        $Status=false;
    }



    $result[message]=$message;
    $result[status]=$Status;
    $result[statusCode]=$StatusCode;

    echo json_encode($result);
}

Я получаю эту ошибку, в то время как вызов из Android

<div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">

<h4>A PHP Error was encountered</h4>

<p>Severity: Notice</p>
<p>Message:  Undefined index: contact_list</p>
<p>Filename: controllers/Api.php</p>
<p>Line Number: 791</p>


    <p>Backtrace:</p>






            <p style="margin-left:10px">
            File: /home/zinedroi/public_html/swiftme/application/controllers/Api.php<br />
            Line: 791<br />
            Function: _error_handler            </p>






            <p style="margin-left:10px">
            File: /home/zinedroi/public_html/swiftme/index.php<br />
            Line: 315<br />
            Function: require_once          </p>




</div>
<div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">

<h4>A PHP Error was encountered</h4>

<p>Severity: Notice</p>
<p>Message:  Undefined index: device_id</p>
<p>Filename: controllers/Api.php</p>
<p>Line Number: 792</p>


    <p>Backtrace:</p>






            <p style="margin-left:10px">
            File: /home/zinedroi/public_html/swiftme/application/controllers/Api.php<br />
            Line: 792<br />
            Function: _error_handler            </p>






            <p style="margin-left:10px">
            File: /home/zinedroi/public_html/swiftme/index.php<br />
            Line: 315<br />
            Function: require_once          </p>




</div>
<div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">

<h4>A PHP Error was encountered</h4>

<p>Severity: Notice</p>
<p>Message:  Undefined index: id</p>
<p>Filename: controllers/Api.php</p>
<p>Line Number: 793</p>


    <p>Backtrace:</p>






            <p style="margin-left:10px">
            File: /home/zinedroi/public_html/swiftme/application/controllers/Api.php<br />
            Line: 793<br />
            Function: _error_handler            </p>






            <p style="margin-left:10px">
            File: /home/zinedroi/public_html/swiftme/index.php<br />
            Line: 315<br />
            Function: require_once          </p>




</div>{"message":"Invalid device","status":false,"status_code":402}

Но он прекрасно работает при вызове этого API из клиента API POSTman с теми же данными. Чего мне не хватает в android? Пожалуйста, помогите мне найти решение.

1 Ответ

0 голосов
/ 12 марта 2020

Я изменил

final NetworkInfo networkInfo = connectivityManager
        .getActiveNetworkInfo();
final OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setReadTimeout(60, TimeUnit.SECONDS);
okHttpClient.setConnectTimeout(60, TimeUnit.SECONDS);
RestAdapter restAdapter = new RestAdapter.Builder()
        .setEndpoint(Constants.END_POINT)
        .setClient(new OkClient(okHttpClient)).setLogLevel(RestAdapter.LogLevel.FULL).build();

api = restAdapter.create(API.class);
if (networkInfo != null && networkInfo.isConnected()) {
    try {
        List<Contacts> sContacts = ContactDatabase
                .getDatabase(context.getApplicationContext())
                .contactsDao()
                .getunlistedContacts("false");

        JSONArray mContactList = new JSONArray();
        for (int i = 0; i < sContacts.size(); i++) {
            try {
                Contacts obj = sContacts.get(i);
                Gson gson = new Gson();
                JSONObject contactJsonObject = new JSONObject(gson.toJson(obj));
                Log.e("ContactObject++", contactJsonObject.toString());
                mContactList.put(contactJsonObject);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        JSONObject mContactsJsonObject = new JSONObject();
        mContactsJsonObject.put("contact_list", mContactList);
        mContactsJsonObject.put(Constants.APIKeys.DEVICE_ID, context.getSharedPreference(Constants.SharedKey.DEVICE_ID));
        mContactsJsonObject.put(Constants.APIKeys.ID, context.getSharedPreference(Constants.SharedKey.USER_ID));
        JSONObject mJsonObject = new JSONObject(api.checkContacts(mContactsJsonObject).toString());
        if (mJsonObject.getBoolean(Constants.APIKeys.STATUS)) {
            JSONArray mUserListJsonArray = mJsonObject.getJSONArray(Constants.APIKeys.USER_LIST);
            for (int i = 0; i < mUserListJsonArray.length(); i++) {
                JSONObject mUserJsonObject = mUserListJsonArray.getJSONObject(i);
                String ContactId = mUserJsonObject.getString(Constants.APIKeys.LOCAL_ID);
                Contacts mContacts = ContactDatabase
                        .getDatabase(context)
                        .contactsDao()
                        .getUserById(ContactId);
                JSONObject userData = mUserJsonObject.getJSONObject(Constants.APIKeys.USER_DETAILS);
                mContacts.setUserid(userData.getString(Constants.APIKeys.ID));
                mContacts.setUserName(userData.getString(Constants.APIKeys.USERNAME));
                mContacts.setImage(userData.getString(Constants.APIKeys.USER_IMAGE));
                mContacts.setStatus(userData.getString(Constants.APIKeys.STATUS));
                if (!mContacts.getPhone().equalsIgnoreCase(context.getSharedPreference(Constants.SharedKey.PHONE))) {
                    ContactDatabase.getDatabase(context.getApplicationContext())
                            .contactsDao()
                            .updateContacts(mContacts);
                }
            }
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }

на

 final NetworkInfo networkInfo = connectivityManager
            .getActiveNetworkInfo();
    final OkHttpClient okHttpClient = new OkHttpClient();
    okHttpClient.setReadTimeout(60, TimeUnit.SECONDS);
    okHttpClient.setConnectTimeout(60, TimeUnit.SECONDS);
    RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint(Constants.END_POINT)
            .setClient(new OkClient(okHttpClient)).setLogLevel(RestAdapter.LogLevel.FULL).build();

    api = restAdapter.create(API.class);
    if (networkInfo != null && networkInfo.isConnected()) {
        try {
            List<Contacts> sContacts = ContactDatabase
                    .getDatabase(context.getApplicationContext())
                    .contactsDao()
                    .getunlistedContacts("false");

            JSONArray mContactList = new JSONArray();
            for (int i = 0; i < sContacts.size(); i++) {
                try {
                    Contacts obj = sContacts.get(i);
                    Gson gson = new Gson();
                    JSONObject contactJsonObject = new JSONObject(gson.toJson(obj));
                    Log.e("ContactObject++", contactJsonObject.toString());
                    mContactList.put(contactJsonObject);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
            JSONObject mContactsJsonObject = new JSONObject();
            mContactsJsonObject.put("contact_list", mContactList);
            mContactsJsonObject.put(Constants.APIKeys.DEVICE_ID, context.getSharedPreference(Constants.SharedKey.DEVICE_ID));
            mContactsJsonObject.put(Constants.APIKeys.ID, context.getSharedPreference(Constants.SharedKey.USER_ID));
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("https://swiftme.zinedroid.com/api/check_Contacts");

            try {
                StringEntity se = new StringEntity(mContactsJsonObject.toString());
                httppost.setEntity(se);

                HttpResponse result = httpclient.execute(httppost);

                HttpEntity resultEntity = result.getEntity();
                String responseString = EntityUtils.toString(resultEntity);
                JSONObject mJsonObject = new JSONObject(responseString);
                if (mJsonObject.getBoolean(Constants.APIKeys.STATUS)) {
                    JSONArray mUserListJsonArray = mJsonObject.getJSONArray(Constants.APIKeys.USER_LIST);
                    for (int i = 0; i < mUserListJsonArray.length(); i++) {
                        try {
                            JSONObject mUserJsonObject = mUserListJsonArray.getJSONObject(i);
                            String ContactId = mUserJsonObject.getString(Constants.APIKeys.SYSTEM_ID);
                            List<Contacts> contactsList = ContactDatabase
                                    .getDatabase(context)
                                    .contactsDao()
                                    .getBySystemid(ContactId);
                            Contacts mContacts = contactsList.get(0);
                            JSONObject userData = mUserJsonObject.getJSONObject(Constants.APIKeys.USER_DETAILS);
                            mContacts.setUserid(userData.getString(Constants.APIKeys.ID));
                            mContacts.setUserName(userData.getString(Constants.APIKeys.USERNAME));
                            mContacts.setImage(userData.getString(Constants.APIKeys.USER_IMAGE));
                            mContacts.setStatus(userData.getString(Constants.APIKeys.STATUS));
                            if (!mContacts.getPhone().equalsIgnoreCase(context.getSharedPreference(Constants.SharedKey.PHONE))) {
                                ContactDatabase.getDatabase(context.getApplicationContext())
                                        .contactsDao()
                                        .updateContacts(mContacts);
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

Теперь все работает нормально.

...