【问题标题】:Why am I receiving a JSON exception trying to load data from host url?为什么我在尝试从主机 url 加载数据时收到 JSON 异常?
【发布时间】:2017-03-31 03:50:08
【问题描述】:

我不断收到 JSON 异常。数据不会加载。

PHP 代码:

mysql_connect("somedbuser.byethost13.com","user", "pass") or die(mysql_error());

mysql_select_db("some_database");

$id = $_GET["id"];

$sql=mysql_query("select * from brewery_data where id between ($id+1) and ($id+2)");

while($row=mysql_fetch_assoc($sql))
$output[]=$row;

header('Content-Type:Application/json');

echo(json_encode($output));

mysql_close();
?>

public class BrowseBrewery extends MainActivity {

    private AutoCompleteTextView actvBreweryName;
    private AutoCompleteTextView actvBreweryState;
    private RecyclerView recyclerView;
    private LinearLayoutManager linearLayoutManager;
    private CustomAdapter adapter;
    private List<BreweryData> brewery_data_list;
    String[] breweryNames;

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

        actvBreweryName = (AutoCompleteTextView) findViewById(R.id.actv_brewery_name);
        actvBreweryState = (AutoCompleteTextView) findViewById(R.id.actv_state);
        cbAdditives = (CheckBox) findViewById(R.id.cb_additives);
        recyclerView = (RecyclerView) findViewById(R.id.brewery_recycler_view);

        brewery_data_list = new ArrayList<>();
        load_data_from_server(0);

        linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);

        adapter = new CustomAdapter(this, brewery_data_list);
        recyclerView.setAdapter(adapter);

        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                if (linearLayoutManager.findLastCompletelyVisibleItemPosition() == brewery_data_list.size()-1) {
                    load_data_from_server(brewery_data_list.get(brewery_data_list.size()-1).getId());
                }
            }
        });

        for (int i = 0; i < brewery_data_list.size(); i++) {
            breweryNames[i] = brewery_data_list.get(i).getName();
        }

        ArrayAdapter<String> stateAdapter = new ArrayAdapter<>
                (this, android.R.layout.select_dialog_item, states);
        actvBreweryState.setThreshold(1);
        actvBreweryState.setAdapter(stateAdapter);
    }

    private void load_data_from_server(final int id) {
        AsyncTask<Integer,Void,Void> task = new AsyncTask<Integer, Void, Void>() {

            @Override
            protected Void doInBackground(Integer... integers) {
                OkHttpClient client = new OkHttpClient();
                Request request = new Request.Builder().url("http://thebeerguru.byethost13.com/conn_all.php?id="+id).build();
                try {
                    Response response = client.newCall(request).execute();

                    JSONArray array = new JSONArray(response.body().string());

                    for (int i=0; i<array.length(); i++) {
                        JSONObject object = array.getJSONObject(i);

                        BreweryData data = new BreweryData(
                                object.getInt("id"),
                                object.getString("name"),
                                object.getString("image_link"),
                                object.getString("city"),
                                object.getString("state"),
                                object.getString("phone"),
                                object.getString("website"),
                                object.getString("year_established"),
                                object.getInt("rating"),
                                object.getString("featured"));

                        brewery_data_list.add(data);
                    }

                } catch (IOException e) {
                    e.printStackTrace();
                } catch (JSONException e) {
                    System.out.println("End of Content");
                }
                return null;
            }

            @Override
            protected void onPostExecute(Void aVoid) {
                adapter.notifyDataSetChanged();
            }
        };
        task.execute(id);
    }
}

JSON 数据:

[{
    "id": "1",
    "name": "57 Brew Pub & Bistro",
    "image_link": "https:\/\/static.wixstatic.com\/media\/d39f67_ffb7b66c09694eea85479d7a478b64a7~mv2.png\/v1\/fill\/w_278,h_209,al_c,usm_0.66_1.00_0.01\/d39f67_ffb7b66c09694eea85479d7a478b64a7~mv2.png",
    "city": "Greenville",
    "state": "MI",
    "phone": "(616) 712-6226",
    "website": "57brewpub.com",
    "year_established": "N.A.",
    "rating": "0",
    "featured": "true"
}]

【问题讨论】:

  • 发布堆栈跟踪
  • stop using mysql_* functions These extensions 已在 PHP 7 中被删除。了解 PDO 和 @987654325 的 prepared 语句@ 并考虑使用 PDO,it's really pretty easy
  • 在通过 jsonlint.com 运行 JSON 后发布它以验证它是否有效。
  • 那是什么乱七八糟的东西?当然不是 JSON。
  • 堆栈跟踪表明来自服务器的响应不是 json,它包含 html、body 等

标签: java php android json


【解决方案1】:

问题是我正在使用的 Web 主机(Byet Host)实现了一个名为 testcookie-nginx-module 的简单安全反机器人模块,用于缓解 L7 DDoS 攻击。

https://kyprizel.github.io/testcookie-nginx-module/

testcookie-nginx-module 进行两步验证:

1) 第一次完成 HTTP 请求时,模块返回 javascript 而不是我们期望的 JSON。此脚本在客户端(通常是 Web 浏览器)上执行并生成包含 AES 密钥的验证 cookie。

2) 脚本将验证 cookie 添加到文档中,并将其重定向到我们实际想要访问的 url。 testcookie-nginx-module 验证 cookie AES 密钥,并让请求访问 url,该 url 将以我们想要访问的 JSON 数据进行响应。 在以下 HTTP 请求中,客户端将存储 cookie 并将其添加到请求中,从而跳过第 1 步。

我们只需要在 HTTP 请求中添加一个 cookie 即可通过 testcookie-nginx-module。

这些链接应该有助于优化代码并帮助未来的开发人员解决同样的问题:

ByetHost server passing html values "Checking your browser" with JSON String

Add cookie to client request OkHttp

:-)

只需调用 .addHeader 对我有用。

        @Override
        protected Void doInBackground(Integer... integers) {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url("http://thebeerguru.byethost13.com/conn_all.php?id="+id)
                    .addHeader("Cookie", "__test=THE_CONTENT_OF_MY_COOKIE; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/")
                    .build();

            try {
                Response response = client.newCall(request).execute();

                JSONArray array = new JSONArray(response.body().string());

感谢大家的建议和支持!

【讨论】:

    猜你喜欢
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    相关资源
    最近更新 更多