Android: проблема отправить (используя Retrofit в Kotlin) или получить из php файл json

Я занимаюсь разработкой приложения для 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
}
}

0

Решение

На данный момент (в вашем php-файле) вы проверяете, есть ли поле с ключом ==json,
Но если вы внимательно посмотрите на свой sendPost() функция, вы никогда не добавляете json поле для тела, следовательно, ответ не будет ожидаемым.

решение может быть

val jsonObject = JSONObject()
jsonObject.put("type", type)
jsonObject.put("tsagk",tsagk)

val body = JSONObject()
body.put("json", jsonObject)

а затем передавая body значение вашего почтового запроса.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]