Android: проблема отправить (используя Retrofit в Kotlin) или получить из php файл json - PullRequest
0 голосов
/ 28 ноября 2018

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

интерфейс 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
}
}

1 Ответ

0 голосов
/ 28 ноября 2018

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

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

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

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

, а затем передать значение body вашему почтовому запросу.

...