[英]Error trying to POST specified “id” to server for json response with Android Volley
I am carrying over a product id from the main activity to a detail activity then on to a comments activity. 我将产品ID从主要活动转移到详细活动,然后再转移到评论活动。 I am using Volley and Android Studio. 我正在使用Volley和Android Studio。 I have a listview populated from a remote database. 我有一个从远程数据库填充的列表视图。 When an item is clicked, the items' id is passed to the detail activity using an intent. 单击某个项目后,该项目的ID将使用意图传递给明细活动。 In the detail activity, when the user clicks on a FAB, that products id is passed over to the comments activity also using an intent. 在详细信息活动中,当用户单击FAB时,该产品ID也会使用意图传递给评论活动。 When I click on the FAB the comments activity opens but doesn't show anything. 当我单击FAB时,评论活动打开,但未显示任何内容。 I the logcat within Android Studio, I get the following error: 我在Android Studio中使用logcat时,出现以下错误:
Comments: Error: org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONArray 注释:错误:org.json.JSONException:类型java.lang.String的值<br不能转换为JSONArray
This is the PHP code for retrieving the comments for the specified product id: 这是用于检索指定产品ID的注释的PHP代码:
<?php
include_once("config.php");
$query=mysqli_query($con,"SELECT * FROM comments WHERE pid=".$_GET['pid']);
$array;
while($result=mysqli_fetch_assoc($query)){
$array[]=$result;
}
echo json_encode($array);
?>
Detail Activity 详细活动
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.commentsfab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Pass the image title and url to DetailsActivity
Intent intentTwo = new Intent(ProductsDetail.this, Comments.class);
intentTwo.putExtra("pid", pid);
intentTwo.putExtra("name", name);
intentTwo.putExtra("image", img);
intentTwo.putExtra("rating", rating);
//Start comments activity
startActivity(intentTwo);
}
});
Comments Activity 评论活动
public class Comments extends AppCompatActivity {
private ProgressDialog dialog=null ;
private NetworkImageView cmntImg;
private TextView cmtjjTxt;
private RatingBar cmntRB;
private String TAG="Comments";
private String tag_json_arry = "json_array_req";
private String url = "http://192.168.0.5:80/demoapp";
private String url_file="/comments.php";
private CommentsAdapter adapter;
private ListView list;
ArrayList<CommentsRowData> cmntrowdata;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.comments);
final String pid = getIntent().getStringExtra("pid");
final String name = getIntent().getStringExtra("name");
final String img = getIntent().getStringExtra("image");
final String rating = getIntent().getStringExtra("rating");
list=(ListView)findViewById(R.id.commentsList);
cmntrowdata=new ArrayList<CommentsRowData>();
dialog= new ProgressDialog(this);
dialog.setMessage("Loading...");
dialog.show();
cmntImg = (NetworkImageView)findViewById(R.id.picComments);
cmntImg.setImageUrl(img, VolleyController.getInstance().getImageLoader());
cmtjjTxt = (TextView)findViewById(R.id.titleComments);
cmtjjTxt.setText(name);
cmntRB = (RatingBar)findViewById(R.id.ratingBar3);
cmntRB.setRating(Float.valueOf(rating));
JsonArrayRequest request = new JsonArrayRequest(url+url_file,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
Log.d(TAG, response.toString()); try {
for(int i=0;i<response.length();i++){
String pid=response.getJSONObject(i).getString("pid");
String cid=response.getJSONObject(i).getString("cid");
String username = response.getJSONObject(i).getString("username");
String comment = response.getJSONObject(i).getString("comment");
cmntrowdata.add(new CommentsRowData(pid,cid,username,comment));
}
} catch (JSONException e) {
e.printStackTrace();
}
adapter=new CommentsAdapter(Comments.this, cmntrowdata);
list.setAdapter(adapter);
dialog.dismiss();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d(TAG, "Error: " + error.getMessage());
dialog.dismiss();
}
//@Override
protected Map<String, String> getParams(){
Map<String,String> params = new HashMap<String,String>();
params.put("pid",pid);
return params;
}
});
VolleyController.getInstance().addToRequestQueue(request, tag_json_arry);
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
}
}
Products are in one table and the comments are in a separate table. 产品在一个表中,注释在另一个表中。 Thats why I'm passing the "pid" over with an intent. 这就是为什么我故意传递“ pid”。 I'm trying to get the JSON response of comments for only comments that correspond with the given "pid". 我正在尝试仅获取与给定“ pid”相对应的注释的注释的JSON响应。 The comments table looks like this: 注释表如下所示:
EDIT If I enter the following URL in my browser, 编辑如果我在浏览器中输入以下URL,
http://localhost/demoapp/comments.php?sid=2 http://localhost/demoapp/comments.php?sid = 2
I get the following JSON response.. 我收到以下JSON响应。
[
{
"pid": "2",
"cid": "1",
"username": "john",
"comment": "one of my favorites"
},
{
"pid": "2",
"cid": "2",
"username": "jane",
"comment": "this was so yummy"
}
]
So there has to be something within my Android code that is causing the error 所以我的Android代码中一定有导致错误的内容
For JSON parsing u should have header specifying the content to be json. 对于JSON解析,您应具有将内容指定为json的标头。 As the error suggests you are just echoing the json data in the html. 如错误所示,您只是在html中回显json数据。 You get such when the received data is in html file. 当接收的数据在html文件中时,您会收到这样的消息。 Try setting the content type to json in the header 尝试在标题中将内容类型设置为json
put header('Content-Type: application/json');
放置header('Content-Type: application/json');
in your php file before echoing 在您的PHP文件中,然后回显
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.