【发布时间】:2020-06-23 16:40:33
【问题描述】:
我正在开发一个安卓应用程序。我正在尝试使用 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}
但在使用相同数据从 POSTman API 客户端调用该 API 时,它工作得非常好。 我在android中缺少什么?请帮助我找到解决方案。
【问题讨论】:
-
你有一些糟糕的 PHP。
$contactArray=$JsonData[contactList];应该是$contactArray=$JsonData['contactList'];deviceId 和 userId 相同。 -
它是代码点火器。我已经在常量中声明了这一点。它在 Postman API 客户端中也可以正常工作