我想从多个库存JSON数据中获取数据,但是我知道如何一次仅获取一个。 我找不到一种方法。 如果我仅请求AAPPL,则有效,但如果我也请求FB,则无效
有关API的更多信息,我从以下位置获取数据: https://financialmodelingprep.com/developer/docs#Realtime-Stock-Price
我试图添加更多的股票 final String stockID =“ AAPL,FB”;
在浏览器中显示数据 https://financialmodelingprep.com/api/company/price/AAPL,FB?datatype=json 但不在应用程序中。
public class MainActivity extends AppCompatActivity {
ListView textView;
ArrayList<String> stocks;//is a resizable array
ArrayAdapter<String> adapter; //Returns a view for each object in a collection of data objects you provide
RequestQueue queue; //Cola peticiones volley
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
queue = Volley.newRequestQueue(this); //Creamos una requestqueue para que gestione hilos, peticiones y demas.
stocks = new ArrayList<>();
adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, stocks); //Pasing the context, the row layout and the resource?
textView.setAdapter(adapter); //Setting to the listview the arrayadapter that returns the view from the arraylist
addstock();
}
//TODO: add the rest of the stocks
private void addstock() {
final String stockID = "AAPL";
final String stockName = "Apple";
String url = "https://financialmodelingprep.com/api/company/price/" +stockID+"?datatype=json";
//Making the request
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try{
JSONObject value = response.getJSONObject(stockID);
String price = value.getString("price");
String Linestock = stockName+ ":"+price+"$";
stocks.add(Linestock);//Adding it to the arraylist
adapter.notifyDataSetChanged(); //And to the view
} catch (Exception e){
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO: Handle error
}
});
queue.add(jsonObjectRequest);
}
}
答案 0 :(得分:1)
您可以使请求异步。 为此,您可以检出此tutorial:
我个人使用okhttp3软件包。 有了这个,您可以构建一个像这样的函数:
public static String performPostCall(String requestURL, JSONObject postDataParams, String auth)
{
String response;
Log.d(LOG_TAG, "Send: " + postDataParams.toString() + " to " + requestURL + " Auth: " + auth);
try
{
Request request;
Builder tmp = new Builder();
tmp.connectTimeout(10, TimeUnit.SECONDS);
tmp.readTimeout(30, TimeUnit.SECONDS);
tmp.writeTimeout(30, TimeUnit.SECONDS);
OkHttpClient client = tmp.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, postDataParams.toString());
if (auth.equals(""))
{
request = new Request.Builder().url(requestURL).post(body).addHeader("Accept", "application/json").addHeader("Content-Type", "application/json").build();
}
else
{
request = new Request.Builder().url(requestURL).post(body).addHeader("Accept", "application/json").addHeader("Content-Type", "application/json").addHeader("authorization", "Bearer " + auth).build();
}
Response recv = client.newCall(request).execute();
response = recv.body().string();
}
catch (Exception e)
{
response = "{\"api_version\":1,\"status\":-1}";
Log.e(LOG_TAG, e.getMessage());
}
Log.d(LOG_TAG, "Received: " + response);
return response;
}
答案 1 :(得分:0)
如果您仅将stockID
设置为AAPL,FB
行
response.getJSONObject(stockID)
不起作用,因为AAPL,FB
没有对象,空指针catch块将捕获并吞下空指针异常。
try{
String[] stockIDs = stockID.Split(","); // assuming stockID is the full string you passed to the API. i.e "AAPL,FB" so we have to get individual stocks.
for(int i= 0; i < stockIDs.size; i++) {
JSONObject value = response.getJSONObject(stockIDs[i]);
String price = value.getString("price");
String Linestock = stockName+ ":"+price+"$";
stocks.add(Linestock);//Adding it to the arraylist
}
adapter.notifyDataSetChanged(); //And to the view
} catch (Exception e){
// Log.e(....); so you see the error on LogCat atleast
}
您还可以迭代JSON对象的属性,而不管传递给API的属性如何。