当前位置: 首页 > 知识库问答 >
问题:

Android截击贴子串入身体

管梓
2023-03-14

我正在尝试使用Volley库与我的RESTful API通信。

当我要持票人代币时,我必须在身体里贴上绳子。字符串应如下所示:grant_type=password

有关WebApi个人帐户的更多信息:http://www.asp.net/web-api/overview/security/individual-accounts-in-web-api

不幸的是,我不知道如何解决它...

我正在尝试这样的事情:

StringRequest req = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        VolleyLog.v("Response:%n %s", response);
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        VolleyLog.e("Error: ", error.getMessage());
                    }
                }){
                    @Override
                    protected Map<String, String> getParams() throws AuthFailureError {
                        Map<String, String> params = new HashMap<String, String>();
                        params.put("grant_type", "password");
                        params.put("username", "User0");
                        params.put("password", "Password0");
                        return params;
                    }

                    @Override
                    public Map<String, String> getHeaders() throws AuthFailureError {
                        Map<String, String> headers = new HashMap<String, String>();
                        headers.put("Content-Type", "application/x-www-form-urlencoded");
                        return headers;
                    }
                };

我一直收到400个坏请求。我想我实际上是这样发送请求的:

grant_type:password, username:User0, password:Password0

而不是:

grant_type=password&username=Alice&password=password123

如果有人有任何想法或建议,我将不胜感激。。

共有3个答案

松元明
2023-03-14

我知道这很古老,但我遇到了同样的问题,我在这里找到了一个更干净的解决方案:如何使用带有字符串体的截击发送POST请求?

龙飞文
2023-03-14

首先,我建议您通过打印日志或使用网络嗅探器(如wireshark或fiddler)查看发送的内容。

试着把帕拉姆放进体内怎么样?如果您仍然想要一个StringRequest,您需要扩展它并覆盖getBody()方法(类似于JsonObjectRequest

宗建章
2023-03-14

要发送带有用户名和密码等参数的普通POST请求(无JSON),通常需要覆盖getParams()并传递参数映射:

public void HttpPOSTRequestWithParameters() {
    RequestQueue queue = Volley.newRequestQueue(this);
    String url = "http://www.somewebsite.com/login.asp";
    StringRequest postRequest = new StringRequest(Request.Method.POST, url, 
        new Response.Listener<String>() 
        {
            @Override
            public void onResponse(String response) {
                Log.d("Response", response);
            }
        }, 
        new Response.ErrorListener() 
        {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d("ERROR","error => "+error.toString());
            }
        }
            ) {     
        // this is the relevant method
        @Override
        protected Map<String, String> getParams() 
        {  
            Map<String, String>  params = new HashMap<String, String>();
            params.put("grant_type", "password"); 
            // volley will escape this for you 
            params.put("randomFieldFilledWithAwkwardCharacters", "{{%stuffToBe Escaped/");
            params.put("username", "Alice");  
            params.put("password", "password123");

            return params;
        }
    };
    queue.add(postRequest);
}

要在Volley StringRequest中发送任意字符串作为POST体数据,需要覆盖getBody()

public void HttpPOSTRequestWithArbitaryStringBody() {
    RequestQueue queue = Volley.newRequestQueue(this);
    String url = "http://www.somewebsite.com/login.asp";
    StringRequest postRequest = new StringRequest(Request.Method.POST, url, 
        new Response.Listener<String>() 
        {
            @Override
            public void onResponse(String response) {
                Log.d("Response", response);
            }
        }, 
        new Response.ErrorListener() 
        {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d("ERROR","error => "+error.toString());
            }
        }
            ) {  
         // this is the relevant method   
        @Override
        public byte[] getBody() throws AuthFailureError {
            String httpPostBody="grant_type=password&username=Alice&password=password123";
            // usually you'd have a field with some values you'd want to escape, you need to do it yourself if overriding getBody. here's how you do it 
            try {
                httpPostBody=httpPostBody+"&randomFieldFilledWithAwkwardCharacters="+URLEncoder.encode("{{%stuffToBe Escaped/","UTF-8");
            } catch (UnsupportedEncodingException exception) {
                Log.e("ERROR", "exception", exception);
                // return null and don't pass any POST string if you encounter encoding error
                return null;
            }
            return httpPostBody.getBytes();
        }
    };
    queue.add(postRequest);
}

另一方面,凌空文档是不存在的,而且StackOverflow答案的质量非常差。真不敢相信这样一个例子的答案还没有出现。

 类似资料:
  • 我想向服务器发送一篇帖子,帖子的正文是真是假。我有这个代码,我使用截击库 ShoozyHeader()将内容类型设置为text/plain,并将Accept设置为text/plain以及身份验证所需的其他标头。 如果我尝试http://requestmaker.com/,服务器正确响应,但我运行此代码,服务器响应: 错误的请求-无效的头HTTP错误400。请求的标头名称无效。 如果删除getBod

  • 我使用反应原生66时运行得到错误 Yarn run v1.22.17$react-原生run-android info运行jetifier将库迁移到AndroidX。您可以使用“--no-jetifier”标志禁用它。Jetifier发现1428个文件要转发jetify。使用4个工作人员... info JS服务器已经运行。信息安装应用程序...配置项目:react-nate-fire base

  • 我正在尝试在Android上进行改装,以获得完整的PDF。但目前要得到回应还不完全。 由于HttpLoggingInterceptor,我得到了很多日志: 在我自己的日志上,我只得到了这个: 这是前面显示的日志的第一部分。 有什么想法吗?我被绊倒了。

  • 我正在尝试使用Volley获取JSON对象以创建动态自动完成,但在使用Volley请求时,我在日志cat中看到: 截击:[486]基本网络。logSlowRequests:请求的HTTP响应= 这些答案并没有解决我的问题。 这里是初始化请求队列的Singleton类: 发出请求的方法: 下面是HTTP Connector类:

  • 我试图使用Android Volley库发送JSON Post请求,但我似乎没有得到json的正文,我在我的Web服务器上得到未定义的正文参数。我需要json的参数体是一个单一的对象"name=某些Val } 我也在上面的代码中尝试了这一点,但没有成功:

  • 我想从URL获取一些数据,但服务器速度非常慢。。。因此,每当我使用凌空截击获取数据时,我都会得到TimeOurError,在服务器速度较慢的情况下,我是否可以处理凌空截击应该尝试获取数据多长时间。。。它只需要很少的时间,我也希望不断运行这个请求来检查数据,我计划使用计时器来完成它。。。可以使用计时器连续检查数据吗? 这是我现在的截击请求。。。它适用于其他URL 我需要连续调用这些函数(在应用程序内