問題ステートメント:
Volleyを使用して、さまざまなHTTPステータスコード(400、403、200など)のJSONオブジェクトを返すREST APIにアクセスしようとしています。
200以外のHTTPステータスの場合、「予期しない応答コード400」が問題のようです。この「エラー」を回避する方法はありますか?
コード:
protected void getLogin() {
final String mURL = "https://somesite.com/api/login";
EditText username = (EditText) findViewById(R.id.username);
EditText password = (EditText) findViewById(R.id.password);
// Post params to be sent to the server
HashMap<String, String> params = new HashMap<String, String>();
params.put("username", username.getText().toString());
params.put("password", password.getText().toString());
JsonObjectRequest req = new JsonObjectRequest(mURL, new JSONObject(
params), new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONObject obj = response
.getJSONObject("some_json_obj");
Log.w("myApp",
"status code..." + obj.getString("name"));
// VolleyLog.v("Response:%n %s", response.toString(4));
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.w("error in response", "Error: " + error.getMessage());
}
});
// add the request object to the queue to be executed
AppController.getInstance().addToRequestQueue(req);
}
Volley
のソースコードを変更せずにこれを行う1つの方法は、VolleyError
内の応答データを確認し、自分で解析することです。
f605da3 commit
、Volley
は、生のネットワーク応答を含む ServerError
exception をスローします。
したがって、エラーリスナーで次のようなことを行うことができます。
/* import com.Android.volley.toolbox.HttpHeaderParser; */
public void onErrorResponse(VolleyError error) {
// As of f605da3 the following should work
NetworkResponse response = error.networkResponse;
if (error instanceof ServerError && response != null) {
try {
String res = new String(response.data,
HttpHeaderParser.parseCharset(response.headers, "utf-8"));
// Now you can use any deserializer to make sense of data
JSONObject obj = new JSONObject(res);
} catch (UnsupportedEncodingException e1) {
// Couldn't properly decode data to string
e1.printStackTrace();
} catch (JSONException e2) {
// returned data is not JSONObject?
e2.printStackTrace();
}
}
}
将来、Volley
が変更された場合、上記のアプローチに従って、サーバーによって送信された生データのVolleyError
を確認して解析する必要があります。
ソースファイル で言及されているTODO
を実装することを望みます。
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/json; charset=utf-8");
return headers;
}
Content-Typeをヘッダーに追加する必要があります。
私も同じエラーを受け取りましたが、私の場合はrlを空白で呼び出していました。
次に、以下のように解析して修正しました。
String url = "Your URL Link";
url = url.replaceAll(" ", "%20");
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new com.Android.volley.Response.Listener<String>() {
@Override
public void onResponse(String response) {
...
...
...
これを試して ...
StringRequest sr = new StringRequest(type,url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// valid response
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// error
}
}){
@Override
protected Map<String,String> getParams(){
Map<String,String> params = new HashMap<String, String>();
params.put("username", username);
params.put("password", password);
params.put("grant_type", "password");
return params;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String,String> params = new HashMap<String, String>();
// Removed this line if you dont need it or Use application/json
// params.put("Content-Type", "application/x-www-form-urlencoded");
return params;
}
ステータスコードを取得したいですか?
VolleyError
のメンバー変数タイプはNetworkResponse
であり、パブリックです。
Httpエラーコードのerror.networkResponse.statusCode
にアクセスできます。
皆さんのお役に立てば幸いです。
私の場合、:8080でreg_urlを書いていませんでした。文字列reg_url = " http://192.168.29.163:8080/register.php ";
変化する
public static final String URL = " http:// api-Location ";
に
public static final String URL = " https:// api-Location "
000webhostappアプリを使用しているために発生します
私がやったのは、URLに余分な「/」を追加することでしたe.g。:
String url = "http://www.google.com"
に
String url = "http://www.google.com/"
すべてを更新するために、いくつかの検討の後、以前の問題を解決するために代わりにAsync Http Clientを使用することにしました。このライブラリにより、特にすべてのシナリオ/ HTTPステータスでJSONオブジェクトが返される場合に、HTTP応答をよりクリーンなアプローチ(to me)で操作できます。
protected void getLogin() {
EditText username = (EditText) findViewById(R.id.username);
EditText password = (EditText) findViewById(R.id.password);
RequestParams params = new RequestParams();
params.put("username", username.getText().toString());
params.put("password", password.getText().toString());
RestClient.post(getHost() + "api/v1/auth/login", params,
new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers,
JSONObject response) {
try {
//process JSONObject obj
Log.w("myapp","success status code..." + statusCode);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onFailure(int statusCode, Header[] headers,
Throwable throwable, JSONObject errorResponse) {
Log.w("myapp", "failure status code..." + statusCode);
try {
//process JSONObject obj
Log.w("myapp", "error ..." + errorResponse.getString("message").toString());
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}