首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Android Volley:我如何从服务器获取响应,不管它是什么?

Android Volley:我如何从服务器获取响应,不管它是什么?
EN

Stack Overflow用户
提问于 2019-06-27 02:45:36
回答 1查看 465关注 0票数 0

我从Kotlin的Android开发开始。我正在尝试使用Volley来读取API和更新GUI元素。我让它与使用http GET方法的StringObjectRequests一起工作,现在我的问题是什么时候我想使用POST方法。

下面是我的基本函数:

代码语言:javascript
运行
AI代码解释
复制
fun volley() {
    val queue = Volley.newRequestQueue(this)
    val url   = "http://x.x.x.x/api.php"
    val json = JSONObject()

    json.put("ciudad", "Londres")
    json.put("nombre", "Luis")

    val stringRequest = JsonObjectRequest(Request.Method.POST,
      url, json,
      Response.Listener<JSONObject> { response ->
        taContenido.setText(response.toString())
      },
      Response.ErrorListener {
        taContenido.setText("No Funcionó")
      })

    queue.add(stringRequest)
  }

"API“中的代码非常简单...

代码语言:javascript
运行
AI代码解释
复制
<?php
$j = array('ciudad' => $_POST["ciudad"],
   'nombre' => $_POST["nombre"]);

echo json_encode($j);

我的问题是,当我运行该函数时,它通过ErrorListener部分并显示"No Funcionó“。我不知道为什么。当然,如果我用Postman尝试我的API,它会返回预期的{"ciudad":"Londres","nombre":"Luis"}

那么,在使用JsonObjectRequest时,如何查看服务器返回的内容呢

如果我将请求更改为StringRequest,我当然可以看到PHP错误(因为没有定义$_POST[] :|

EN

回答 1

Stack Overflow用户

发布于 2019-06-27 04:06:14

我正在用爪哇发帖。请转换为Kotlin。创建一个像这样的单例类-

代码语言:javascript
运行
AI代码解释
复制
public class VolleyManager {
    private static VolleyManager ourInstance;
    private final Context mContext;
    private final ImageLoader mImageLoader;
    private RequestQueue mRequestQueue;

    private VolleyManager(final Context pContext) {
        mContext = pContext;
        mImageLoader = new ImageLoader(getRequestQueue(), new ImageLoader.ImageCache() {
            private LruCache<String, Bitmap> mCache = new LruCache<>(20);

            @Override
            public Bitmap getBitmap(final String url) {
                return mCache.get(url);
            }

            @Override
            public void putBitmap(final String url, final Bitmap bitmap) {
                mCache.put(url, bitmap);
            }
        });
    }

    private RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            mRequestQueue = Volley.newRequestQueue(mContext);
        }
        return mRequestQueue;
    }

    public static synchronized VolleyManager getInstance(final Context pContext) {
        if (ourInstance == null) {
            ourInstance = new VolleyManager(pContext);
        }
        return ourInstance;
    }

    public void addRequest(final Request pRequest) {
        getRequestQueue().add(pRequest);
    }

    public ImageLoader getImageLoader() {
        return mImageLoader;
    }

    public <T> void addToRequestQueue(Request<T> req, String tag) {
        req.setTag(tag);
        getRequestQueue().add(req);
    }

    public void cancelPendingRequests(Object tag) {
        if (mRequestQueue != null) {
            mRequestQueue.cancelAll(tag);
        }
    }
}

然后提出这样的请求-

代码语言:javascript
运行
AI代码解释
复制
public class AccessTokenRequest extends StringRequest {
    Map<String,String> mParms = new ArrayMap<>();
    Map<String,String> mHeader = new ArrayMap<>();

    public AccessTokenRequest(String code, Response.Listener<String> listener, Response.ErrorListener errorListener) {
        super(Method.POST, WebConfig.END_POINT + WebConfig.ACCESS_TOKEN_METHOD, listener, errorListener);
        mHeader.put("Authorization","Basic MjJEUT");
        mHeader.put("Content-Type","application/x-www-form-urlencoded");
        mParms.put("clientId","63FGDF");
        mParms.put("grant_type","authorization_code");
        mParms.put("redirect_uri","https://example.com/thu");
        mParms.put("code",code);
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        return mHeader;
    }

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

在活动中,像这样打电话-

代码语言:javascript
运行
AI代码解释
复制
private void requestAccessToken(String code) {

        final ProgressDialog pDialog = new ProgressDialog(this);
        pDialog.setMessage("Loading...");
        pDialog.setCancelable(false);
        pDialog.setCanceledOnTouchOutside(false);
        pDialog.show();

        VolleyManager.getInstance(AuthorizationActivity.this).addRequest(new AccessTokenRequest(code, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {
                    JSONObject responseJsonObj = new JSONObject(response);
                    String accessToken = responseJsonObj.getString("access_token");
                    long expiresIn = responseJsonObj.getInt("expires_in") + (System.currentTimeMillis() / 1000);
                    String refreshToken = responseJsonObj.getString("refresh_token");
                    List<Scope> scopes = parseScopes(responseJsonObj.getString("scope"));
                    String tokenType = responseJsonObj.getString("token_type");
                    String userId = responseJsonObj.getString("user_id");



                } catch (JSONException e) {
                    e.printStackTrace();
                } finally {
                    pDialog.dismiss();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                pDialog.dismiss();
                Toast.makeText(AuthorizationActivity.this, "Please check internet connection", Toast.LENGTH_LONG).show();
            }
        }));
    }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56783216

复制
相关文章
【DB笔试面试511】如何在Oracle中写操作系统文件,如写日志?
可以利用UTL_FILE包,但是,在此之前,要注意设置好UTL_FILE_DIR初始化参数。
AiDBA宝典
2019/09/30
29.2K0
【DB笔试面试511】如何在Oracle中写操作系统文件,如写日志?
Newbe.Claptrap框架入门,第一步——创建项目,实现简易购物车
让我们来实现一个简单的“电商购物车”需求来了解一下如何使用 Newbe.Claptrap 进行开发。
newbe36524
2023/08/23
1950
Newbe.Claptrap框架入门,第一步——创建项目,实现简易购物车
linux which
which 是根据使用者所配置的 PATH 变量内的目录去搜寻可运行档的,所以,不同的 PATH 配置内容所找到的命令是不一样的
用户5760343
2022/05/23
5580
which命令
which命令用于标识在终端提示符下键入可执行文件名称或命令时执行的给定可执行文件的位置,该命令在PATH环境变量中列出的目录中搜索作为参数指定的可执行文件。
WindRunnerMax
2020/09/16
8940
Linux & Shell 在系统中查找程序 which type
mwangblog
2018/07/04
1.9K0
git命令中带有特殊符号如@
使用带用户密码clone的方式: git clone https://username:password@remote 当username和password中含有特殊符号会导致出错, 因为为http的请求,所以需要将特殊符号encode成url格式的 java使用: String c = java.net.URLEncoder.encode(".","utf-8"); System.out.println(c); 源文档 <http://blog.csdn.net/qq1142003960/article/
千往
2018/01/24
2.1K0
Linux之which命令
/opt/java/jdk1.8.0_231/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/python3/bin:/root/bin
入门笔记
2021/12/25
5770
Newbe.Claptrap 框架入门,第一步 —— 创建项目,实现简易购物车
让我们来实现一个简单的 “电商购物车” 需求来了解一下如何使用 Newbe.Claptrap 进行开发。
newbe36524
2020/07/09
1K0
Newbe.Claptrap 框架入门,第一步 —— 创建项目,实现简易购物车
Linux之which命令
/opt/java/jdk1.8.0_231/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/python3/bin:/root/bin
入门笔记
2021/02/17
6010
Linux之which命令
/opt/java/jdk1.8.0_231/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/python3/bin:/root/bin
入门笔记
2022/06/02
5690
Spring在无RedirectAttributes的情况下(如Interceptor中)使用Flash scope
判断逻辑很简单,但是重定向的时候需要前台有消息提示,如果是在Controller中,可以在方法上注入RedirectAttributes参数,但是Interceptor中默认没有这个参数,那么我们如何实现RedirectAttributes的flashMessage功能呢?
飞奔去旅行
2019/06/13
5.5K0
如何在openGauss 2.1.0中使用Job?
Job类似Unix中的crontab,有定时执行的功能,可以在指定的时间点或每天的某个时间点等自行执行任务。在各类系统使用运行过程中,经常会遇到需要定时完成的任务,比如定时更新数据,定时统计数据生成报表等等,这些工作都可以使用Job来完成。在openGauss 2.1.0中,提供了以下接口来实现管理Job。
数据和云
2021/11/10
6.4K0
如何在openGauss 2.1.0中使用Job?
Linux之which命令
/opt/java/jdk1.8.0_231/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/python3/bin:/root/bin
入门笔记
2021/07/02
1.2K0
如何在CDH中安装和使用StreamSets
StreamSets由Informatica前首席产品官Girish Pancha和Cloudera前开发团队负责人Arvind Prabhakar于2014年创立。他们成立该公司主要是应对来自动态数据(data in motion)的挑战 - 包括数据源,数据处理和数据本身,这是一个称为“数据漂移“(https://streamsets.com/reports/data-drift/)的问题。StreamSets设想从头开始管理数据流,避免已有产品和工具的缺陷,并启用一种管理动态数据(data in motion)的新方法。
Fayson
2018/03/30
36.1K2
which(1) command
which 可指定一个或多个参数。对于它的每个参数,它将可执行文件的完整路径打印到 stdout。它通过使用与 bash(1) 相同的算法在环境变量 PATH 中列出的目录中搜索可执行文件或脚本来实现这一点。
恋喵大鲤鱼
2023/10/12
1620
.NET周报【1月第2期 2023-01-13】
https://www.cnblogs.com/tcjiaan/p/17024363.html
InCerry
2023/03/08
2.7K0
.NET周报【1月第2期 2023-01-13】
stdin and stdout which it's ?
最近写了几个C函数,来处理项目中一个Desktop跨应用的进程通信,被32-bit,LE(BE)折磨了很久,stdin and stdout 看起来是一个很简单的标准输入输出,但是处理的过程中,却遇到了很大的障碍,因为历史问题,一个bytes的长度,需要将消息的位置移动4个byte存储消息的长度,先发送给对方,告诉对方我即将发送一个多少长度的byte,反之解析也是亦然。
icepy
2019/06/24
9890
stdin and stdout which it's ?
如何在 Linux 中安装、设置和使用 SNMP?
SNMP(Simple Network Management Protocol)是一种用于管理和监控网络设备的协议。它允许网络管理员通过远程方式收集设备的运行状态、性能数据和错误信息,以便进行故障排除和网络优化。在Linux系统中,我们可以安装、设置和使用SNMP来监控和管理服务器和网络设备。本文将详细介绍在Linux中安装、设置和使用SNMP的步骤和方法。
网络技术联盟站
2023/06/25
3.2K0
如何在 Linux 中安装、设置和使用 SNMP?
点击加载更多

相似问题

FluentAssertions: FluentAssertions包含"IsEquivalentTo“元素

49

如何在FluentAssertions中对集合中的属性使用Exclude?

9100

如何在AllNotSatisfy中创建“FluentAssertions”条件

112

FluentAssertions:如何在lambda中设置断点

33

如何在R中设置which函数

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文