2016-03-07 59 views
2

我正在使用Volley庫向Android後端發送一個來自Android Java的http請求。後端應用程序按照預期響應一個錯誤代碼和描述,以及一個StatusDescription。我可以通過wireshark查看響應狀態描述,但不知道如何獲取android端的描述字符串。如何使用Volley獲取錯誤消息描述

final JsonObjectRequest request = new JsonObjectRequest(JsonObjectRequest.Method.POST, 
           url,json, 
          new Response.Listener<JSONObject>() { 

           @Override 
           public void onResponse(JSONObject response) { 
            TextView mTextView = (TextView) findViewById(R.id.output); 
            print("Success"); 
           } 
          }, new Response.ErrorListener() { 

           @Override 
           public void onErrorResponse(VolleyError error) { 
            TextView mTextView = (TextView) findViewById(R.id.output); 
            print("Failure (" + error.networkResponse.statusCode + ")"); 
//Trying to get the error description/response phrase here 
          } 
         } 
        ); 

這是C#代碼處理該請求:

[WebInvoke(方法= 「POST」,UriTemplate = 「用戶」,BodyStyle = WebMessageBodyStyle.Wrapped,RequestFormat = WebMessageFormat.Json,ResponseFormat = WebMessageFormat .json)] [OperationContract] void addUser(String username,String firstname,String lastname,String email,String hash) Console.WriteLine(DateTime.Now +「Packet receieved」);

 //Stores the response object that will be sent back to the android client 
     OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse; 
     String description = "User added"; 
     response.StatusCode = System.Net.HttpStatusCode.OK; 

     //Tries to add the new user 
     try 
     { 
      userTable.Insert(username,firstname,lastname,email,hash); 
     } 
     catch (SqlException e) 
     { 
      //Default response is a conflict 
      response.StatusCode = System.Net.HttpStatusCode.Conflict; 

      description = "Bad Request (" + e.Message + ")"; 

      //Check what the conflict is 
      if (userTable.GetData().AsEnumerable().Any(row => username == row.Field<String>("username"))) 
      { 
       description = "Username in use"; 
      } 
      else if (userTable.GetData().AsEnumerable().Any(row => email == row.Field<String>("email"))) 
      { 
       description = "Email address in use"; 
      } 
      else 
      { 
       response.StatusCode = System.Net.HttpStatusCode.BadRequest; 
      } 
     } 

     //display and respond with the description 
     Console.WriteLine(description); 
     response.StatusDescription = description; 
    } 

我已經看過其他人的問題,但似乎無法找到我正在尋找的答案。有人知道怎麼做嗎?我嘗試過的很多方法都會導致空的花括號,表明JSON的空體。我正在嘗試獲取狀態描述。

回答

4

嘗試與此自定義方法:

public void parseVolleyError(VolleyError error) { 
     try { 
      String responseBody = new String(error.networkResponse.data, "utf-8"); 
      JSONObject data = new JSONObject(responseBody); 
      JSONArray errors = data.getJSONArray("errors"); 
      JSONObject jsonMessage = errors.getJSONObject(0); 
      String message = jsonMessage.getString("message"); 
      Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show(); 
     } catch (JSONException e) { 
     } catch (UnsupportedEncodingException errorr) { 
     } 
    } 

它會顯示與從請求錯誤消息烤麪包。在onErrorResponse方法在你的凌空請求調用此:

new Response.ErrorListener() { 
         @Override 
         public void onErrorResponse(VolleyError error) { 
          parseVolleyError(error); 
         } 
        } 
+0

這工作,謝謝你的回覆! – GraphiteEdge

1

您必須重寫parseNetworkError和deliverError方法,並且可以從中獲取錯誤消息。

+0

你能提供一些代碼作爲例子嗎?不太確定該怎麼做。 – GraphiteEdge

1

例重寫方法:

final JsonObjectRequest request = new JsonObjectRequest(JsonObjectRequest.Method.POST, 
      url, json, 
      new Response.Listener<JSONObject>() { 

       @Override 
       public void onResponse(JSONObject response) { 
        TextView mTextView = (TextView) findViewById(R.id.output); 
        print("Success"); 
       } 
      }, new Response.ErrorListener() { 

     @Override 
     public void onErrorResponse(VolleyError error) { 
      TextView mTextView = (TextView) findViewById(R.id.output); 
      print("Failure (" + error.networkResponse.statusCode + ")"); 
     } 
    }){ 
     @Override 
     protected VolleyError parseNetworkError(VolleyError volleyError) { 
      return super.parseNetworkError(volleyError); 
     } 

     @Override 
     public void deliverError(VolleyError error) { 
      super.deliverError(error); 
     } 
    }; 
+0

謝謝你,這有助於:) – GraphiteEdge

0

海事組織,你應該如下覆蓋parseNetworkError

@Override 
protected VolleyError parseNetworkError(VolleyError volleyError) { 
    String json; 
    if (volleyError.networkResponse != null && volleyError.networkResponse.data != null) { 
     try { 
      json = new String(volleyError.networkResponse.data, 
        HttpHeaderParser.parseCharset(volleyError.networkResponse.headers)); 
     } catch (UnsupportedEncodingException e) { 
      return new VolleyError(e.getMessage()); 
     } 
     return new VolleyError(json); 
    } 
    return volleyError; 
} 

然後,裏面onErrorResponse(VolleyError error),您可以使用Log.e(LOG_TAG, error.toString());例如。希望能幫助到你!

+0

感謝您的迴應,它有幫助! – GraphiteEdge

相關問題