如何在android中使用OkHttp从web api获取json数据到RecyclerView

Posted

技术标签:

【中文标题】如何在android中使用OkHttp从web api获取json数据到RecyclerView【英文标题】:How to get json data to RecyclerView from web api using OkHttp in android 【发布时间】:2020-11-04 11:04:41 【问题描述】:

我是 android 的新手,也是 JSON。我正在尝试使用 recyclerviw 从 Web 服务器显示 JSON 格式的数据。我有一些客户详细信息。我想在 recyclerview 中显示这些详细信息。我知道如何从服务中获取数据。但是当它涉及到 web api 时,我对 json 输入和 json 数据感到困惑。当我们使用 web api 时,我不明白如何提取数据。请帮我解决这个问题。

我的 Json 输入如下所示: 网址:http://10.40.0.100:3009/api/GACompany/CompanyData


  "authKey": "CD123",
  "action": "1",
  "idstatus": "",
  "noOfRows": "0",
  "id": "",
  "idApplicationLogin": "",
  "idGACompany": "0",
  "remarks": "",
  "status": "",
  "noOfPointsVerified": "0"
  "fileName": "",
  

我的 JSON :


    "data": 
        "comData": [
            
                "applicationDate": "08-01-2019 ",
                "idApplicationLogin": "AV32",
                "customerName": "Anu A",
                "stateName": "Kerala",
                "DeadLine": "10-02-2020",
                "readStatus": "Un Read"
            ,
            
        ]
        



public class MenuActivity extends AppCompatActivity 

   
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);

        dbHelper = new DbHelper(this);

       
    

    public void listeners(View view) 

        switch (view.getId()) 

           
            case R.id.inbox_button: 

             //   startActivity(new Intent(this, ExampleActivity.class));


                try 

                   JSONObject jsonObject = new JSONObject();
                    jsonObject.put("authKey",Const.Auth_Key_Value);


                    JSONArray jsonArray = new JSONArray();
                    jsonArray.put(jsonObjectKeyValue);

                     JSONObject inboxDetailObj = new JSONObject();
                     inboxDetailObj.put("authKey", jsonArray);
                     //inboxDetailObj.put("action",4);
                     inboxDetailObj.put("idApplicationLogin",2012);

                    new PullInboxDetails(this, inboxDetailObj).execute();
                 
                 catch (JSONException e) 
                    e.printStackTrace();
                

            
            break;

        

    

    private static class PullInboxDetails extends AsyncTask<String, String, String>
        ProgressDialog pd;
        WeakReference<MenuActivity> context;
        OkHttpClient okHttpClient;
        String url;
        Request request;
        MediaType JSON = MediaType.parse("application/json; charset = utf-8");

        JSONObject jsonObject;
        JSONObject resultJson;
        String resultString;
        SharedPreferences shp;


        public PullInboxDetails(MenuActivity contextObj, JSONObject jsonObject) 
            this.context = new WeakReference<>(contextObj);
            this.jsonObject = jsonObject;

            okHttpClient = new OkHttpClient.Builder()
                    .connectTimeout(120,TimeUnit.SECONDS)
                    .build();
        

        protected void onPreExecute()
            super.onPreExecute();
        


        @Override
        protected String doInBackground(String... strings) 

            try 

                url = "http://10.10.0.100:3009/api/GACompany/CompanyData";

                RequestBody body = RequestBody.create(jsonObject.toString(), JSON);
                request = new Request.Builder()
                        //.header("X-Client-Type", "Android")
                        .header("authKey","")
                        .url(url)
                        .post(body)
                        .build();

            

                Response response = okHttpClient.newCall(request).execute();

                if (!response.isSuccessful()) 

                    return "failure";

                

                resultString = response.body().string();
                Log.e("Log", resultString);

             catch (Exception e) 
                Log.e("Log", "Exception", e);
                return "failure";
            

            return "success";
        

        @Override
        protected void onPostExecute(String s) 
            super.onPostExecute(s);

           // pd.dismiss(); // Error
            if (s.equals("success")) 

                Intent intent = new Intent(context.get(), FrontActivity.class);
                intent.putExtra("value", resultString);
                context.get().startActivity(intent);

             else if (s.equals("failure")) 

                Toast.makeText(context.get(), "Pull Failed", Toast.LENGTH_LONG).show();
                

            
        
    





【问题讨论】:

你遇到了什么问题 @ruben 它显示“PullInboxDetailsFailed”。 你可以尝试使用postman 请求甚至返回一些响应,我发现它什么也没返回 @ruben 对不起它的官方数据,所以我只给出了一个示例 url。如果我们给出 url 并输入,邮递员会返回 Output。我的 Json 输出 ``` "data": "comData": [ "applicationDate": "08-01-2019", "idApplicationLogin": "AV32", "customerName": "Anu A", "stateName" :“喀拉拉邦”,“DeadLine”:“10-02-2020”,“readStatus”:“未读”,]``` 你在 logcat 中得到了什么?没有访问权限,我无法检查 【参考方案1】:

尝试像这样创建请求JSON object,将所有key 合二为一jsonObject

JSONObject inboxDetailObj = new JSONObject();
try 
    inboxDetailObj.put("authKey", "CD123");
    inboxDetailObj.put("action", "1");
    inboxDetailObj.put("idstatus", "");
    inboxDetailObj.put("noOfRows", "0");
    ...

    new PullInboxDetails(this, inboxDetailObj).execute();
 catch (JSONException e) 
    e.printStackTrace();

【讨论】:

@Mysterious 很高兴知道,如果知道,请将问题标记为已回答。

以上是关于如何在android中使用OkHttp从web api获取json数据到RecyclerView的主要内容,如果未能解决你的问题,请参考以下文章

使用Retrofit(Okhttp)时如何从android studio中的log cat复制请求正文,标头(不带标签)?

使用OkHttp拦截器和Retrofit进行缓存

使用OkHttp拦截器和Retrofit进行缓存

如何让OkHttp从Jersey获取参数并在Interceptor中使用?

android如何通知用户使用 Toast OkHttp 请求返回 200 事情吗

Android中使用OKHttp上传图片,从相机和相册中获取图片并剪切