问题陈述:
我正在尝试访问一个 REST API,该 API 将使用 Volley 为各种 HTTP 状态代码(400、403、200 等)返回一个 JSON 对象。
对于 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 的源代码的情况下执行此操作的一种方法是检查 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中是否有服务器发送的原始数据并进行解析.
我希望他们实现 source file 中提到的 TODO .
关于Android Volley - BasicNetwork.performRequest : Unexpected response code 400,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26796965/
我正在尝试在ruby中发出https发布请求,它在curl中工作,但我在ruby中收到400错误请求,我无法弄清楚原因。这是ruby代码:require'rubygems'require'net/https'require'uri'require'json'uri=URI.parse("https://api.parse.com/1/push")http=Net::HTTP.new(uri.host,uri.port)http.use_ssl=truehttp.verify_mode=OpenSSL::SSL::VERIFY_NONEreq=Net::HTTP::Post.ne
我正在尝试使用RubygemRestClient为我的一个FusionTables更新样式。这是我的代码:require'rest_client'tableId=''styleId=''key=''table_url="https://www.googleapis.com/fusiontables/v1/tables/#{tableId}/styles/#{styleId}?key=#{key}"update='{"polygonOptions":{"strokeColor":"#ffffff"}}'token='STRINGCONTAININGAUTHORIZATIONTOKEN'R
我正在尝试使用rest-clientgem读取400响应的主体。问题是rest-client通过将其作为错误抛出来响应400,因此我想不出任何方法来获取正文。这是一个激励人心的例子。考虑对facebook图形API的调用:JSON.parse(RestClient.get("https://graph.facebook.com/me?fields=id,email,first_name,last_name&access_token=#{access_token}"))如果access_token过期或无效,facebook会做两件事:返回400BadRequestHTTP响应在响应正文
我正在将angularjs与nodejs集成,现在我在浏览器中遇到错误。http400错误请求。我想知道是前端错误还是后端错误,我需要解决方案。注册.htmlGivenNameshouldbeabove5letters.Pleaseenternumbersonly.Phonenumbermustbe10digits.PleaseentercorrectmailidPasswordisnotmatchAlreadyregistered?注册.js$scope.register=function(user){vardata={"user":{"name":user.name,"email"
考虑以下代码。这只是一个带有axios库的简单httppost请求。axios.post('http://localhost/users',this.state).then(function(response){if(response.status==201){browserHistory.push('/features');}}).catch(function(error){console.log(error);})如果用户在输入中输入了错误的数据,则来自服务器的响应会保留信息,例如密码必须长于...缺少@符号的邮件等...但是不幸的是,如果存在400错误请求状态,我不知道如何进入该
当我尝试在TypeScript中设置fontWeight时出现此错误:Typesofproperty'test'areincompatible.Type'{fontWeight:number;}'isnotassignabletotype'Partial'.Typesofproperty'fontWeight'areincompatible.Type'number'isnotassignabletotype'"inherit"|400|"initial"|"unset"|"normal"|"bold"|"bolder"|"lighter"|100|200|30...'.即使400是一个
我在MVC5布局页面中有一个基本指令,其中包含一个用于搜索的指令。我的问题是无法加载templateUrl(400错误)。如果我直接在浏览器中输入URL,我可以毫无困难或错误地加载html页面。我找不到加载页面的AJAX调用失败的原因。Chrome调试器这是在Chrome中加载的HTML页面app.js(function(){varapp=angular.module("mainApp");app.directive("basicSearch",function(){return{templateUrl:'app/directives/basic-search.html',contro
我目前正在使用带有FusionTableLayer的Googlemap。使用此map,我进行AJAX查询以填充map和结果列表。最近GoogleMapAPI响应出现了一个问题,返回400“MalformedRequest”错误。当在设置过滤器并通过AJAX发送后用新结果集填充map时,偶尔会发生此响应。在查看错误Firefox的调试控制台时,我注意到pb参数可能是问题所在。问题是我不确定这个参数到底有什么格式错误。这是错误的GET请求:https://maps.googleapis.com/maps/vt?pb=[...insert_param_code_here...]&callba
Hapi.jsValidationwithJoi+failAction问题。情况我们想构建一个“传统”服务器端-仅使用Hapi呈现应用程序。我正在尝试理解如何避免返回“raw”400Joi验证失败时给客户端的错误:我们要拦截这个“emailnotallowedtobeempty”validationerror,并在html模板中显示给客户端,而不是简单地返回400错误。@AdriVanHoudt建议我们应该:"LookatfailActionunderhttp://hapijs.com/api#route-options"因此我们将failAction:'log'添加到/registe
我有一个显示用户收到的通知的div,问题是我想分别在用户收到通知并单击通知时以淡入和淡出效果显示它们。这是HTML:Username0每个列表项代表用户的一个friend。divid="messages_notifications_$id$"...包含来自用户特定friend的通知数量,用户尚未阅读的通知数量。$id$是用户friend的唯一标识(因此0表示包含来自id=1的用户friend的所有通知的div,依此类推)。我恢复了使用长轮询对服务器进行异步调用的通知数量,该服务器返回一个json,其中包含来自特定friend的所有消息给用户。然后我使用JQuery使用friend的id