簡體   English   中英

改造POST請求並檢索json編碼結果

[英]Retrofit POST request and retrieve the json encoded result

我有這個問題的谷歌,但我找不到解決方案。 我認為你們可以幫助我解決問題。

我第一次使用翻新庫。

我的問題是,我通過改造發布請求時。 我低於錯誤

D/onFailure: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 1 path $

**主要活動 **

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.util.Date;
import java.util.List;

import retrofit.Call;
import retrofit.Callback;
import retrofit.GsonConverterFactory;
import retrofit.Response;
import retrofit.Retrofit;

public class MainActivity extends AppCompatActivity {
    String url = "http://www.example.com/App/";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getRetrofitObject();
    }

    void getRetrofitObject() {

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        RetrofitObjectAPI service = retrofit.create(RetrofitObjectAPI.class);

         Call<List<district>> call = service.getDistrictDetails("mdistrict","search");

        call.enqueue(new Callback<List<district>>() {
            @Override
            public void onResponse(Response<List<district>> response, Retrofit retrofit) {

                try {
                    //Log.e("response---",response.toString());
                    List<district> StudentData = response.body();
                   // Log.e("StudentData---",StudentData.toString());
                } catch (Exception e) {
                    Log.d("onResponse", "There is an error");
                    e.printStackTrace();
                }

            }

            @Override
            public void onFailure(Throwable t) {
                Log.d("onFailure", t.toString());
            }
        });
    }
}

RetrofitObjectAPI

import java.util.List;

import retrofit.Call;
import retrofit.http.Field;
import retrofit.http.FormUrlEncoded;
import retrofit.http.GET;
import retrofit.http.POST;
import retrofit.http.Query; 

public interface RetrofitObjectAPI {
    @FormUrlEncoded
    @POST("/kwa/api/")
   // Call<List<district>> getDistrictDetails( );
    Call<List<district>> getDistrictDetails(@Field("target") String target, @Field("action") String action);
}

搖籃

compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
compile 'com.google.code.gson:gson:1.7.2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
compile 'com.squareup.okhttp:okhttp:2.4.0'

我的PHP代碼

<?php 
$_errAry = array("status"=>400, "success"=>"false", "message"=>"Can't Service your request ","data"=>array());
$_sucAry = array("status"=>200, "success"=>"true", "message"=>"","data"=>array());

//echo json_encode($_POST);

include_once 'database.php';

// get database connection
$database = new Database();
$db = $database->getConnection();

if(!isset($_POST["target"],$_POST["action"])){echo json_encode($_errAry);exit(0);}

// instantiate Common Objects
include_once 'objects/common.class.php';
include_once 'objects/validate.php';
$_tbl=""; $_cols="";  $_ord=""; //$_whr=" AND sr_status ='0' ";
$_whr="  ";
$_max_date = (isset($_POST["max_date"])) ? $_POST["max_date"] : "";
$_max_id = (isset($_POST["max_id"])) ? (int)$_POST["max_id"] : "";
$_imei = (isset($_POST["imei"])) ? $_POST["imei"]: "";

if($_POST["target"]=="mdistrict" && $_POST["action"]=="search"){
    $_comm = new Common($db); 
    $_stmt = $_comm->readAll("master_district", "sr_id,sr_name", $_whr , " 1 asc "); 
    $_data = array();

    while ($_row = $_stmt->fetch(PDO::FETCH_ASSOC)){
        $_tmpAry = array(
                    "sr_id"=> $_row["sr_id"],
                    "sr_name"=> trim($_row["sr_name"])
                    );
    $_data[] = $_tmpAry;
    }
    $_op = $_sucAry;
    $_op["data"]=$_data;
    echo json_encode($_op);
    exit(0);
}

$_max_date = (isset($_POST["max_date"])) ? $_POST["max_date"] : "";
$_max_id = (isset($_POST["max_id"])) ? (int)$_POST["max_id"] : "";
$_imei = (isset($_POST["imei"])) ? $_POST["imei"]: "";
?>

誰能幫我解決這個問題。 請找出我做錯的地方

我的結果json

{"status":200,"success":"true","message":"","data":[{"sr_id":"1","sr_name":"ALAPPUZHA"},{"sr_id":"2","sr_name":"KOTTAYAM"}]}

您的代碼希望有一個List作為響應,但是您的響應是一個對象,這就是它引發錯誤的原因。

您必須引入一個新的對象,它將包裝您的列表。

例如

class ApiResponse<T> {
    int status;
    String success;
    String message;
    T data;
}

RetrofitObjectAPI

public interface RetrofitObjectAPI {
    @FormUrlEncoded
    @POST("/kwa/api/")
   // Call<List<district>> getDistrictDetails( );
    Call<ApiResponse<List<district>> getDistrictDetails(@Field("target") String target, @Field("action") String action);
}

用法

Call<ApiResponse<List<district>>> call = service.getDistrictDetails("mdistrict","search");
call.enqueue(new Callback<ApiResponse<List<district>>>>() {
    @Override
    public void onResponse(Response<ApiResponse<List<district>>> response, Retrofit retrofit) {

        try {
            //Log.e("response---",response.toString());
            ApiResponse<List<district>> apiResponse = response.body();
            List<district> StudentData = apiResponse.data;
           // Log.e("StudentData---",StudentData.toString());
        } catch (Exception e) {
            Log.d("onResponse", "There is an error");
            e.printStackTrace();
        }

    }

    @Override
    public void onFailure(Throwable t) {
        Log.d("onFailure", t.toString());
    }
});

上面我做的是錯誤的方式。我的數據集是ArrayList<HashMap<String, String>> 所以我更改了如下代碼,現在在我的情況下可以正常工作。

1個ApiClient.java類

import retrofit.GsonConverterFactory;
import retrofit.Retrofit; 

public class ApiClient {
    public static final String BASE_URL = "http://www.yourdomain.com/App/";
    private static Retrofit retrofit = null;


    public static Retrofit getClient() {
        if (retrofit==null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

2 ApiInterface.java接口

import retrofit.Call;
import retrofit.http.Field;
import retrofit.http.FormUrlEncoded;
import retrofit.http.POST;

public interface ApiInterface {
    @FormUrlEncoded
    @POST("kwa/api/index.php")
    Call<Example> getDistrictDetails(@Field("target") String target, @Field("action") String action);

}

3 Example.java類

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Example {

    @SerializedName("status")
    @Expose
    private Integer status;
    @SerializedName("success")
    @Expose
    private String success;
    @SerializedName("message")
    @Expose
    private String message;
   /* @SerializedName("data")
    @Expose
    private List<Datum> data = null;*/
    @SerializedName("data")
    @Expose
    private ArrayList<HashMap<String, String>> tmpList=null;

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getSuccess() {
        return success;
    }

    public void setSuccess(String success) {
        this.success = success;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public ArrayList<HashMap<String, String>> getDatat() {
        return tmpList;
    }

    public void setData(ArrayList<HashMap<String, String>> data) {
        this.tmpList = data;
    } 
}

4 DemoActivity.java我的活動

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import com.panenviron.retrofitstudyapp.R;

import org.json.JSONArray;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import retrofit.Call;
import retrofit.Callback;
import retrofit.Response;
import retrofit.Retrofit;


public class DemoActivity extends AppCompatActivity {
    private static final String TAG = DemoActivity.class.getSimpleName();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getRetrofitObject();
    }
    void getRetrofitObject() {
        ApiInterface apiService =  ApiClient.getClient().create(ApiInterface.class);
        Call<Example> call = apiService.getDistrictDetails("msection","search");
        call.enqueue(new Callback<Example>() {
            @Override
            public void onResponse(Response<Example> response, Retrofit retrofit) { 
                ArrayList<HashMap<String, String>> tmpList = response.body().getDatat();
                Log.e(TAG+"tmpList---", tmpList.toString());


            }
            @Override
            public void onFailure(Throwable t) {
                Log.e(TAG+"--", t.toString());
            }

        });
    }
}

謝謝大家

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM