無効なWebアドレスのコンテンツをボレーで取得しています。つまり、http://www.gigd32fdsu.com
:これは私のテストコードです:
// Instantiate the RequestQueue.
RequestQueue queue = Volley.newRequestQueue(this);
final String url = "http://www.gigd32fdsu.com";
// Request a string response from the provided URL.
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener() {
@Override
public void onResponse(Object response) {
// Display the first 500 characters of the response string.
mTextView.setText("Response is: " + response.toString().substring(0, 500));
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
mTextView.setText("That didn't work! " + error.networkResponse.statusCode);
}
});
// Add the request to the RequestQueue.
queue.add(stringRequest);
このコードを実行すると、ISPからのエラーページを含むコールバックonResponse(String)を受け取ります。 Webの表示が正しくないことを検出するために、どのようにHTTPステータスコードを読み取ることができますか?
ありがとう
簡単な解決策は、makeStringReq()でparseNetworkResponseをオーバーライドすることです。別のクラスは必要ありません。
private void makeStringReq() {
showProgressDialog();
StringRequest strReq = new StringRequest(Method.GET,
Const.URL_STRING_REQ,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, response.toString());
msgResponse.setText(response.toString());
hideProgressDialog();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
hideProgressDialog();
}
}) {
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
int mStatusCode = response.statusCode;
return super.parseNetworkResponse(response);
}
};
// Adding request to request queue
AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
}
VinceStylingからの応答をより完全にします。私が何をするかをお話します。
このメソッドをオーバーライドしたら、クラスにstatusCodeを保存します。
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
statusCode=response.statusCode;
return super.parseNetworkResponse(response);
}
その後、それをHttpURLConnection定数と比較して、適切に動作するようにします。例えば:
int statusCode=webService.getStatusCode();
switch (statusCode){
case HttpURLConnection.HTTP_OK:
//do stuff
break;
case HttpURLConnection.HTTP_NOT_FOUND:
//do stuff
break;
case HttpURLConnection.HTTP_INTERNAL_ERROR:
//do stuff
break;
}
parseNetworkResponseメソッドをオーバーライドして、statusCode
値を取得するだけです。
public class StrImplRequest extends StringRequest {
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
// take the statusCode here.
response.statusCode;
return super.parseNetworkResponse(response);
}
}
@VinceStylingの答えは問題ありません。または、Requestクラスを拡張して、やりたいことを行うことができます。例えば、
ServerStatusRequestObject extends Request {
private final Response.Listener mListener;
private String mBody = "";
private String mContentType;
public ServerStatusRequestObject(int method,
String url,
Response.Listener listener,
Response.ErrorListener errorListener) {
super(method, url, errorListener);
mListener = listener;
mContentType = "application/json";
if (method == Method.POST) {
RetryPolicy policy = new DefaultRetryPolicy(5000, 0, 5);
setRetryPolicy(policy);
}
}
@Override
protected Response parseNetworkResponse(NetworkResponse response) {
return Response.success(response.statusCode, HttpHeaderParser.parseCacheHeaders(response));
}
@Override
protected void deliverResponse(Object response) {
if (mListener != null) {
mListener.onResponse(response);
}
}
@Override
public byte[] getBody() throws AuthFailureError {
return mBody.getBytes();
}
@Override
public String getBodyContentType() {
return mContentType;
}
@Override
public int compareTo(Object another) {
return 0;
}
その後、応答ハンドラーで、サーバーからメッセージ全体を受信できます。それを試してみてください。