从 api 获取数据适用于 https api,但不适用于 http api



我正在开发一个应用程序,我不得不发出 API get 请求并以 RecyclerView 显示数据(我为此目的使用了改造( 当我完成代码时,我发现数据获取在HTTPS APIs下工作正常,但是当我在BASE_URL中放置HTTP API时,它不起作用。

以下 API 是它正常工作的 API:https://demonuts.com/Demonuts/JsonTest/Tennis/json_parsing.php

但是使用HTTP API,输出不会显示。

主活动

package com.example.parsaniahardik.json_recycler_retrofit;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.scalars.ScalarsConverterFactory;
public class MainActivity extends AppCompatActivity {
    private RetrofitAdapter retrofitAdapter;
    private RecyclerView recyclerView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = findViewById(R.id.recycler);
        fetchJSON();
    }
    private void fetchJSON(){
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(RecyclerInterface.JSONURL)
                .addConverterFactory(ScalarsConverterFactory.create())
                .build();
        RecyclerInterface api = retrofit.create(RecyclerInterface.class);
        Call<String> call = api.getString();
        call.enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {
                Log.i("Responsestring", response.body().toString());
                //Toast.makeText()
                if (response.isSuccessful()) {
                    if (response.body() != null) {
                        Log.i("onSuccess", response.body().toString());
                        String jsonresponse = response.body().toString();
                        writeRecycler(jsonresponse);
                    } else {
                        Log.i("onEmptyResponse", "Returned empty response");//Toast.makeText(getContext(),"Nothing returned",Toast.LENGTH_LONG).show();
                    }
                }
            }
            @Override
            public void onFailure(Call<String> call, Throwable t) {
            }
        });
    }
    private void writeRecycler(String response){
        try {
            //getting the whole json object from the response
            JSONObject obj = new JSONObject(response);
            if(obj.optString("status").equals("true")){
                ArrayList<ModelRecycler> modelRecyclerArrayList = new ArrayList<>();
                JSONArray dataArray  = obj.getJSONArray("data");
                for (int i = 0; i < dataArray.length(); i++) {
                    ModelRecycler modelRecycler = new ModelRecycler();
                    JSONObject dataobj = dataArray.getJSONObject(i);
                    modelRecycler.setName(dataobj.getString("name"));
                    modelRecycler.setCountry(dataobj.getString("country"));
                    modelRecycler.setCity(dataobj.getString("city"));
                    modelRecyclerArrayList.add(modelRecycler);
                }
                retrofitAdapter = new RetrofitAdapter(this,modelRecyclerArrayList);
                recyclerView.setAdapter(retrofitAdapter);
                recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false));
            }else {
                Toast.makeText(MainActivity.this, obj.optString("message")+"", Toast.LENGTH_SHORT).show();
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

适配器

public class RetrofitAdapter extends RecyclerView.Adapter<RetrofitAdapter.MyViewHolder> {
    private LayoutInflater inflater;
    private ArrayList<ModelRecycler> dataModelArrayList;
    public RetrofitAdapter(Context ctx, ArrayList<ModelRecycler> dataModelArrayList){
        inflater = LayoutInflater.from(ctx);
        this.dataModelArrayList = dataModelArrayList;
    }
    @Override
    public RetrofitAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.retro_item, parent, false);
        MyViewHolder holder = new MyViewHolder(view);
        return holder;
    }
    @Override
    public void onBindViewHolder(RetrofitAdapter.MyViewHolder holder, int position) {

        holder.name.setText(dataModelArrayList.get(position).getName());
        holder.country.setText(dataModelArrayList.get(position).getCountry());
        holder.city.setText(dataModelArrayList.get(position).getCity());
    }
    @Override
    public int getItemCount() {
        return dataModelArrayList.size();
    }
    class MyViewHolder extends RecyclerView.ViewHolder{
        TextView country, name, city;

        public MyViewHolder(View itemView) {
            super(itemView);
            country = (TextView) itemView.findViewById(R.id.country);
            name = (TextView) itemView.findViewById(R.id.name);
            city = (TextView) itemView.findViewById(R.id.city);
    }
    }
}

接口

public interface RecyclerInterface {
    String JSONURL = "https://demonuts.com/Demonuts/JsonTest/Tennis/";
    @GET("json_parsing.php")
    Call<String> getString();
}

模型类

public class ModelRecycler {
    private String name, country, city;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getCountry() {
        return country;
    }
    public void setCountry(String country) {
        this.country = country;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
}

我希望我的 API 获取适用于HTTPS APIsHTTP APIs

已解决:如@DEVV911所述,如果您在Android 9(Pie(上测试该应用程序,则会遇到此问题。如果您遇到同样的问题,那么只需在 res 文件夹中创建一个新的 Android 资源目录,并将其命名为"xml",资源类型为 XML。在"xml"文件夹中,创建一个名为"network_security_config"的新 XML 资源文件。里面输入这个

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">YourDomainName.com</domain>
    </domain-config>
</network-security-config>

之后,转到清单文件并在应用程序标记类型中:

<android:networkSecurityConfig="@xml/network_security_config"

然后它工作正常。

最新更新