- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚开始在 Android 上使用 Volley。使用旧的 http 客户端,我可以使用各种 header 和参数完美地发出网络请求,但现在我做不到了。我的请求在 Postman 中如下所示:
POST /token HTTP/1.1
Host: my.api.co.za
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache
username=test&password=1234&grant_type=password
但是我无法在 Volley 中重新创建并执行此请求。我尝试制作一个扩展 Request<JSONObject>
的自定义 Json 请求类但无济于事。请参阅下面我的代码:
public class CustomJsonRequest extends Request<JSONObject> {
private Response.Listener<JSONObject> listener;
private Map<String, String> params;
public CustomJsonRequest(int method, String url, Listener<JSONObject> responseListener, ErrorListener errorListener) {
super(method, url, errorListener);
this.listener = responseListener;
}
@Override
public Map getHeaders() throws AuthFailureError {
Map headers = new HashMap();
headers.put("Accept", "application/json");
headers.put("Content-Type", "application/x-www-form-urlencoded");
return headers;
}
@Override
public byte[] getBody() throws AuthFailureError {
HashMap<String, String> params = new HashMap<String, String>();
params.put("username", "test");
params.put("password", "1234");
params.put("grant_type", "password");
if (params != null && params.size() > 0) {
return encodeParameters(params, getParamsEncoding());
}
return null;
}
/**
* Converts <code>params</code> into an application/x-www-form-urlencoded encoded string.
*/
private byte[] encodeParameters(Map<String, String> params, String paramsEncoding) {
StringBuilder encodedParams = new StringBuilder();
try {
for (Map.Entry<String, String> entry : params.entrySet()) {
encodedParams.append(URLEncoder.encode(entry.getKey(), paramsEncoding));
encodedParams.append('=');
encodedParams.append(URLEncoder.encode(entry.getValue(), paramsEncoding));
encodedParams.append('&');
}
encodedParams.deleteCharAt(encodedParams.lastIndexOf("&"));
Log.e("params", encodedParams.toString());
return encodedParams.toString().getBytes(paramsEncoding);
} catch (UnsupportedEncodingException uee) {
throw new RuntimeException("Encoding not supported: " + paramsEncoding, uee);
}
}
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
Log.e("response", response.toString());
return Response.success(new JSONObject(jsonString),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
@Override
protected void deliverResponse(JSONObject response) {
// TODO Auto-generated method stub
Log.e("response", response.toString());
listener.onResponse(response);
}
private Priority mPriority;
public void setPriority(Priority priority) {
mPriority = priority;
}
@Override
public Priority getPriority() {
return mPriority == null ? Priority.NORMAL : mPriority;
}
}
我在我的 MainActivity
中这样调用它:类:
CustomJsonRequest request = new CustomJsonRequest(Request.Method.POST, AUTH_URL, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
//showJSON(response);
VolleyLog.v("Response:%n %s", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
txtError(error);
}
});
有人可以告诉我创建此请求时哪里出错了吗?
最佳答案
您可以尝试使用我的以下示例代码:
String url = "http://server/token";
Map<String, String> stringMap = new HashMap<>();
stringMap.put("grant_type", "password");
stringMap.put("username", "bnk");
stringMap.put("password", "bnk123");
Uri.Builder builder = new Uri.Builder();
Iterator entries = stringMap.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry entry = (Map.Entry) entries.next();
builder.appendQueryParameter(entry.getKey().toString(), entry.getValue().toString());
entries.remove();
}
String requestBody = builder.build().getEncodedQuery();
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, requestBody, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
// do something...
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// do something...
}
}){
@Override
public String getBodyContentType() {
return "application/x-www-form-urlencoded";
}
};
<小时/>
更新:
如果您的项目使用 Google 官方 volley 作为模块,则应将以下内容添加到 JsonObjectRequest.java
文件中:
public JsonObjectRequest(int method, String url, String requestBody,
Listener<JSONObject> listener, ErrorListener errorListener) {
super(method, url, requestBody, listener, errorListener);
}
<小时/>
更新 2:
如果您不想像我上面提到的那样编辑 JsonObjectRequest.java
文件,您可以使用以下代码:
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
// do something...
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// do something...
}
}) {
@Override
public String getBodyContentType() {
return "application/x-www-form-urlencoded";
}
@Override
public byte[] getBody() {
// init parameters
Map<String, String> params = new HashMap<>();
params.put("grant_type", "password");
params.put("username", "bnk");
params.put("password", "bnk123");
// encode parameters (can use Uri.Builder as above)
String paramsEncoding = "UTF-8";
StringBuilder encodedParams = new StringBuilder();
try {
for (Map.Entry<String, String> entry : params.entrySet()) {
encodedParams.append(URLEncoder.encode(entry.getKey(), paramsEncoding));
encodedParams.append('=');
encodedParams.append(URLEncoder.encode(entry.getValue(), paramsEncoding));
encodedParams.append('&');
}
return encodedParams.toString().getBytes(paramsEncoding);
} catch (UnsupportedEncodingException uee) {
throw new RuntimeException("Encoding not supported: " + paramsEncoding, uee);
}
}
};
希望对你有帮助!
关于java - 无法在 Volley 中模仿 POSTMAN 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34838547/
我在 postman 的预请求脚本中有以下代码——它给了我当前日期。我宁愿想要昨天的日期(current_timestamp - 1 天)。 var current_timestamp = new D
Postman Pro 可以向多个 Free Postman 用户共享无限制的请求吗? 我正在考虑设置一个 Pro 帐户作为中央请求收集存储,然后 Free Postman 用户只需克隆/读取它即可。
有可能在 postman 内部使用数组变量吗? 例如在请求正文中: { "myData" : {{arrayVariable}} } 在数据文件中: { "arrayVariable"
我有一个 postman 集合,我想将一组三个 API 调用链接在一起,并使用 runner 函数提供数据文件。可以说他们是:/prepareUpload/upload/confirmUpload并且
如何从另一个 GET API 的预请求脚本选项卡调用 POST API 请求(登录 API 具有带用户名和密码字段的请求正文),该 API 在其请求 url 中使用来自上述 API 正文的 token
当前,可以从global和environment范围以及预请求脚本中的通用variable设置和获取变量。但是,文档尚不清楚,是否可以通过编程方式设置collection作用域变量。 例如 pm.en
我正在使用 postman (v7.7.3),当我上传文件以将正文作为表单数据发送时,我收到了以下警告。 “此文件不在您的工作目录中。与您共享此请求的队友将无法使用此文件。为了使协作更容易,您可以在“
standalone Postman client在哪里?对于 Windows,离线工作时保存集合吗? 为了澄清,我想找到禁用在线同步时 Postman 默认保存集合文件的位置。我不试图 export
我之前使用过 Postman Chrome 扩展以及 Postman Interceptor Extension在 Postman 中捕获 Chrome 发出的 HTTP 请求。 但是,现在 Post
在 Postman 中单击保存的请求后,我得到的 View 如下所示: 要查看正文,我需要单击“正文”。 这不是什么大问题,除非我要处理 20 个左右的请求,并在每个请求的正文中查找特定的内容,如果能
我正在查看 Postman 快捷方式面板,但没有看到在请求正文中注释部分代码的快捷方式,复制和粘贴非常烦人 发表评论。 最佳答案 根据快捷方式面板Ctrl +/打开快捷方式面板但我不小心在请求正文中这
是否可以在我的 postman 测试用例中访问响应大小的值? 虽然我能够看到响应大小以及状态代码和响应时间(我可以在使用responseCode.code和responseTime的测试用例中使用这两
我正在尝试使用 Windows native Postman 应用程序 (V4.8.0) 将简单的 Get 命令发布到我在本地主机上运行的服务,但它们失败了。 postman 控制台显示 Error:
Newman 帮助指定集合、环境和全局变量可以作为路径或 URL 传递。我可以看到如何从 Postman 获取收藏 URL(通过转到“共享”>“收藏链接”)。 如何在 Postman 中获取 Envi
我们正在扩展到一个大型微服务构建,并通过 postman 完成更多测试(现场验证、错误测试等)。好奇...您的团队如何组织大量 API 的集合? (按 API、按测试类型、按发布等)从一个团队传递到另
Postman 对我来说是一个了不起的工具,但我对使用变量有一些疑问。在我的收藏中,我有 4 个选项卡/请求。 首先是获取用于其他三个的 token ( token 在 15 分钟后过期,因此我必须经
由于所有 Postman 集合基本上都是 .json 文件,因此很难通过代码审查工具审查在 Postman 中编写的代码。 目前我继续在GitHub上查看这样的.json文件,但是不太方便。 例如,这
我正在尝试使用 Newman 自动化 postman 测试.授权有问题。授权 bearer token 发生变化并且是动态的。有谁知道如何自动执行此操作? 最佳答案 Postman 有变量这个很好的特
Postman 允许使用 pre-defined variables 生成随机虚拟数据,例如,这个将被随机公司名称替换: {{$randomCompanyName}} 多次使用预定义变量会在每个请
我正在使用一个开放的 API。 但我只使用了 API 提供的响应中的一小部分数据。当我使用具有不同参数的 API 进行测试以查看响应时。 我不想每次发送请求时都看到整个 API 响应,我只想看到我感兴
我是一名优秀的程序员,十分优秀!