簡體   English   中英

如何制作和處理在 Android 中提供 json 文件作為響應的 Http 請求?

[英]how to make and handle an Http Request that give a json file as response in Android?

我有一個項目,包括使用雪地機進行航空(顯示和解碼雪地機),我想使用我的 api 密鑰向服務器發出請求,但是當我將完整鏈接放在瀏覽器上時,響應不是正文響應而是 json每次發出請求時都會下載的文件。如何使用 Android 在 Java 代碼中處理此文件。您能給我一個示例嗎? 並提前致謝。

an example that i tried:

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


    URL url = null;
    try {
        url = new URL("https://ajax.googleapis.com/ajax/services/feed/find?" +
                "v=1.0&q=Official%20Google%20Blog&userip=INSERT-USER-IP");
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
    URLConnection connection = null;
    try {
        connection = url.openConnection();
    } catch (IOException e) {
        e.printStackTrace();
    }
    connection.addRequestProperty("Referer", "https://applications.icao.int/dataservices/api/notams- 
     realtime-list?api_key=my_api_key&format=json&criticality=1&locations=ENBO");

    StringBuilder builder = new StringBuilder();
    BufferedReader reader = null;
    try {
        reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    } catch (IOException e) {
        e.printStackTrace();
    }
    while(true) {
        String line="";
        try {
            if (!((line = reader.readLine()) != null)) break;
        } catch (IOException e) {
            e.printStackTrace();
        }
        builder.append(line);
    }

    try {
        JSONObject json = new JSONObject(builder.toString());
        System.out.println("the json object received is::"+json);
    } catch (JSONException e) {
        e.printStackTrace();
    }
  }

看看排球

您可以創建一個自定義請求類來處理文件下載,如下所示:

import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.toolbox.HttpHeaderParser;

import java.util.HashMap;
import java.util.Map;

public class InputStreamVolleyRequest extends Request<byte[]> {
    private final Response.Listener<byte[]> mListener;
    private Map<String, String> mParams;

    //create a static map for directly accessing headers
    public Map<String, String> responseHeaders;
    public Map<String, String> mRequestHeaders;

    public InputStreamVolleyRequest(int method, String mUrl, Response.Listener<byte[]> listener,
                                    Response.ErrorListener errorListener, HashMap<String, String> params, HashMap<String, String> requestHeaders) {
        super(method, mUrl, errorListener);
        setShouldCache(false);
        mRequestHeaders = requestHeaders;
        mListener = listener;
        mParams = params;
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        mRequestHeaders.putAll(super.getHeaders());
        return mRequestHeaders;
    }

    @Override
    protected Map<String, String> getParams() {
        return mParams;
    }

    @Override
    protected void deliverResponse(byte[] response) {
        mListener.onResponse(response);
    }

    @Override
    protected Response<byte[]> parseNetworkResponse(NetworkResponse response) {
        responseHeaders = response.headers;
        return Response.success(response.data, HttpHeaderParser.parseCacheHeaders(response));
    }
}

然后像這樣使用它:

String mUrl = "https://ajax.googleapis.com/ajax/services/feed/find?" +
        "v=1.0&q=Official%20Google%20Blog&userip=INSERT-USER-IP";
HashMap<String, String> requestHeaders = new HashMap<>();
requestHeaders.put("Referer", "https://applications.icao.int/dataservices/api/notams-realtime-list?api_key=my_api_key&format=json&criticality=1&locations=ENBO")
InputStreamVolleyRequest request = new InputStreamVolleyRequest(Request.Method.GET, mUrl,
        new Response.Listener<byte[]>() {
            @Override
            public void onResponse(byte[] response) {
                try {
                    if (response != null) {
                        JSONObject responseJsonObject = new JSONObject(new String(response));
                        // TODO do something with the JSONObject
                    }
                } catch (Exception e) {
                    Log.d("KEY_ERROR", "UNABLE TO DOWNLOAD FILE");
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {

    @Override
    public void onErrorResponse(VolleyError error) {
        // TODO handle the error
        error.printStackTrace();
    }
}, null, requestHeaders);

RequestQueue mRequestQueue = Volley.newRequestQueue(getApplicationContext(), new HurlStack());
mRequestQueue.add(request);

更新:

確保您已將以下權限添加到您的清單中:

<uses-permission android:name="android.permission.INTERNET" />

最好使用 AsyncHttpClient。

例子:

public void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
    (new AsyncHttpClient()).get(url, params, new JsonHttpResponseHandler() {

        @Override
        public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
            //handle async response callback
        }

        @Override
        public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
            //handle async response callback
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
            //handle async response callback
        }
    });
}

教程: https : //guides.codepath.com/android/Using-Android-Async-Http-Client

暫無
暫無

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

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