【问题标题】:POST JSON Object using Volley on Android to get Authentication Token在 Android 上使用 Volley POST JSON 对象以获取身份验证令牌
【发布时间】:2014-10-29 11:27:14
【问题描述】:

我需要使用以下 JSON 对象格式向服务器发送 POST 请求:

{"auth": {"tenantName": "<tenant>", "passwordCredentials": {"username": "<user>", "password": "<password>"}}}

获取身份验证令牌作为后续请求的响应:

{
access: {
token: {
issued_at: "2014-11-03T01:45:53.819103"
expires: "2014-11-03T02:45:53Z"
id: "686889ba4244432696aaac1d022f4973" 

到目前为止,我只是在测试与 volley 的连接,看看我是否可以在 Toast 中得到正确的响应:

public void loginRequest(){
    String[] credentials = getSharedPrefs();
    final String user = credentials[0];
    final String pass = credentials[1];
    final String url = credentials[2];

    JSONObject login = new JSONObject();
    JSONObject result = new JSONObject();
    try {
        JSONObject auth = login.getJSONObject("auth");
        JSONObject tenantName = auth.getJSONObject("tenantName");
        JSONObject passwordCredentials = auth.getJSONObject("passwordCredentials");
        JSONObject username = passwordCredentials.getJSONObject("username");
        JSONObject password = passwordCredentials.getJSONObject("password");
        login.put("tenantName","");
        login.put("username",user);
        login.put("password",pass);
    } catch (JSONException e) {
        e.printStackTrace();
    }


    JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.POST, url, login,
            new Response.Listener<JSONObject>()
            {
                @Override
                public void onResponse(JSONObject response) {
                    // display response
                    // TO DO
                    Toast toast = Toast.makeText(Login.this,response.toString(),Toast.LENGTH_LONG);
                    toast.setGravity(Gravity.TOP|Gravity.CENTER_HORIZONTAL,0,120);
                    toast.show();

                }
            },
            new Response.ErrorListener()
            {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(Login.this, error.getMessage(), Toast.LENGTH_LONG).show();
                }
            }
    ){

        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<String, String>();
            params.put("tenantName", "");
            params.put("username", user);
            params.put("password", pass);
            return params;
        }

        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("Accept", "application/json");
            params.put("Content-Type", "application/json");
            return params;
        }

    };

        RequestQueue queue = Volley.newRequestQueue(this);
        queue.add(getRequest);
    }
}

但是我收到以下错误:

E/Volley﹕ [893] NetworkDispatcher.run: Unhandled exception java.lang.RuntimeException: Bad URL
java.lang.RuntimeException: Bad URL
        at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:147)
        at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:110)
 Caused by: java.net.MalformedURLException: Protocol not found:
        at java.net.URL.<init>(URL.java:176)
        at java.net.URL.<init>(URL.java:125)
        at com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:101)
        at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:96)
            at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:110)

知道我错过了什么吗?

编辑:我做了更多的挖掘并意识到上面的错误是由字符串“url”上的错误 getter 引起的。我解决了这个问题,但现在我得到了:

E/Volley﹕ [787] BasicNetwork.performRequest: Unexpected response code 400 for http://10.10.10.10:5000/v2.0/tokens 

似乎代码没有正确发送 JSON。例如,如果我尝试使用 Advanced Rest Client 向站点发送除 aplication/json 之外的任何内容,我也会收到 400 Bad Request

【问题讨论】:

  • 我不知道......也许它的意思是“错误的 URL”“找不到 MalformedURLException 协议”
  • 网址没问题。我用 Advanced REST Client 测试,我可以得到令牌 ok
  • 不,这不好,它不包含协议又名架构......只需记录并检查
  • 对不起,我明白你的意思了......我忘了把它贴在问题上。它现在在那里,但我仍然收到错误
  • Volley 可能会添加标题。使用代理工具查看这些标头的外观。

标签: android json post token android-volley


【解决方案1】:
package com.example.wexindemo;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

import org.json.JSONException;
import org.json.JSONObject;

import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.HttpHeaderParser;

public class JsonObjectPostRequest extends Request<JSONObject> {

    private Map<String, String> mMap;

    private String params;

    private Listener<JSONObject> mListener;

    public JsonObjectPostRequest(String url, Listener<JSONObject> listener,
            ErrorListener errorListener, String params) {

        super(Request.Method.POST, url, errorListener);

        mListener = listener;


        this.params = params;

    }


    public JsonObjectPostRequest(String url, Listener<JSONObject> listener,
            ErrorListener errorListener, Map map) {

        super(Request.Method.POST, url, errorListener);

        mListener = listener;

        mMap = map;


    }

//  @Override
//  protected Map<String, String> getParams() throws AuthFailureError {
//
//      return mMap;
//
//  }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String, String> headers = new HashMap<String, String>();
        headers.put("Charset", "UTF-8");
        headers.put("Content-Type", "application/x-javascript");
        headers.put("Accept-Encoding", "gzip,deflate");
        return headers;
    }

    @Override
    public byte[] getBody() throws AuthFailureError {
        return params == null ? super.getBody() : params.getBytes();
    }

    @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {

        try {

            String jsonString =

            new String(response.data,
                    HttpHeaderParser.parseCharset(response.headers));

            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) {

        mListener.onResponse(response);

    }

}

ps:You try to use this class to send a post request

【讨论】:

  • 谢谢!我去看看
【解决方案2】:

我使用字符串使其工作:

        final String json = "{\"auth\": {\"tenantName\": \""+tnt+"\", \"passwordCredentials\": {\"username\": \""+user+"\", \"password\": \""+pass+"\"}}}";


        JSONObject login = null;
        try {
            login = new JSONObject(json);
        } catch (JSONException e) {
            e.printStackTrace();
        }

但是我仍然想知道如何以编程方式使用 JSONObject 来了解正确的语法。有接盘侠吗?

【讨论】:

    猜你喜欢
    • 2016-04-04
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 2019-09-16
    • 2021-06-17
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    相关资源
    最近更新 更多