Я занимаюсь разработкой приложения для Android на Kotlin и столкнулся с проблемой отправки с помощью ‘POST’ объекта json.
Проблема в том, что я принимаю в качестве ответа следующее:
Post{username='null',pass='null',latitude=null,longitude=null,id=2}
Как мы заключаем, потому что ID = 2 в вышеприведенном «сообщении» данные json не нулевые, а поля. Так что проблема в том, что я не могу правильно декодировать и читать данные JSON и видно из приведенного выше сообщения, потому что имя пользователя, проход, широта, долгота равны нулю. PHP, который отправляет вышеуказанное сообщение, следующий, и я нашел его в интернете ( http://eosrei.net/articles/2011/12/basic-json-requestresponse-php ) и изменил его.
<?php
if (_REQUEST['json']) {
$data = file_get_contents('php://input');
$json_data = json_decode($data , true);
if (is_null($json_data)) {
$response = array(
'username' => json_data['username'],
'pass' => json_data['pass'],
'latitude' => json_data['latitude'],
'longitude' => json_data['longitude'],
'id' => 1
);
}
else {
$response = array(
'username' => $json_data->username,
'pass' => $json_data->pass,
'latitude' => $json_data->latitude,
'longitude' => $json_data->longitude,
'id' => 2
);
}
}
else {
$response = array(
'type' => 'error',
'tsagk' => 'TSAGK',
'value' => 'No JSON value set',
);
}
$encoded = json_encode($response);
header('Content-type: application/json');
exit($encoded);
?>
У меня также есть следующий APIService в моем Android:
интерфейс APIService {
@POST("json.php")
@Headers("Content-Type: application/json;charset=utf-8", "Accept: application/json;charset=utf-8", "Cache-Control: max-age=640000")
fun savePost(
@Body jsonObject: JSONObject
): Observable<Post>
}
Внутри MainActivity у меня есть sendPost:
fun sendPost(user: String, pwd: String) {
writeOnDebugger("sendPost()")
val jsonObject = JSONObject()
jsonObject.put("username", user)
jsonObject.put("pass",pwd)
jsonObject.put("latitude",35.5)
jsonObject.put("longitude",36.5)
writeOnDebugger(jsonObject.toString())
// RxJava
mAPIService?.savePost(jsonObject)?.subscribeOn(Schedulers.io())?.observeOn(AndroidSchedulers.mainThread())
?.subscribe(object : Subscriber<Post>() {
override fun onCompleted() {
writeOnDebugger("onCompleted()")
}
override fun onError(e: Throwable) {
writeOnDebugger("onError()")
}
override fun onNext(post: Post) {
writeOnDebugger("onNext()")
showResponse(post.toString())
}
})
}
fun showResponse(response: String) {
writeOnDebugger("showResponse()")
if (mResponseTv?.getVisibility() === View.GONE) {
mResponseTv?.setVisibility(View.VISIBLE)
}
mResponseTv?.setText(response)
}
У меня есть пост класс:
class Post {
@SerializedName("username")
@Expose
var username: String? = null
@SerializedName("pass")
@Expose
var pass: String? = null
@SerializedName("latitude")
@Expose
var latitude: Double? = null
@SerializedName("longitude")
@Expose
var longitude: Double? = null
@SerializedName("id")
@Expose
var id: Int? = null
override fun toString(): String {
return "Post{" +
"username='" + username + '\''.toString() +
", pass='" + pass + '\''.toString() +
", latitude=" + latitude +
", longitude=" + longitude +
", id=" + id +
'}'.toString()
}
}
RetrofitClient:
object RetrofitClient {
private var retrofit: Retrofit? = null
// var gson = GsonBuilder()
// .setLenient()
// .create()
fun getClient(baseUrl: String): Retrofit? {
if (retrofit == null) {
retrofit = Retrofit.Builder()
.baseUrl(baseUrl)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(/*gson*/))
.build()
}
return retrofit
}
}
На данный момент (в вашем php-файле) вы проверяете, есть ли поле с ключом ==json
,
Но если вы внимательно посмотрите на свой sendPost()
функция, вы никогда не добавляете json
поле для тела, следовательно, ответ не будет ожидаемым.
решение может быть
val jsonObject = JSONObject()
jsonObject.put("type", type)
jsonObject.put("tsagk",tsagk)
val body = JSONObject()
body.put("json", jsonObject)
а затем передавая body
значение вашего почтового запроса.
Других решений пока нет …