Android 对 API url 的简单 POST 和 GET 请求

Posted

技术标签:

【中文标题】Android 对 API url 的简单 POST 和 GET 请求【英文标题】:Android Simple POST and GET requests to an API url 【发布时间】:2021-03-11 19:49:30 【问题描述】:

我对标题所描述的主题非常陌生,而且我有点迷茫,所以我需要一些指导。基本上,首先我想从 API 向 URL 发出 POST 请求。然后检查用户是否成功登录并获取不记名令牌作为响应。最后,我想发出一个 GET 请求(包括我之前获得的不记名令牌)以接收其他一些数据(那里有很多产品及其标题、图像 url 等)。我想在这两种情况下我都必须收到一种 JSON。我检查了一个类似的主题here,我认为它可能会对我进行登录。但是,这是否也适用于之后对其他数据的 GET 请求?

最后,当我得到一个带有数据的 JSON(来自 GET 请求)时,知道如何将 JSON 的某些部分转换为字符串数组吗? (例如,从中获取产品标题、图像 url)所以我希望这些 URL 在一个字符串数组和另一个字符串数组中以类似的方式存储它们的标题等)

非常感谢。

【问题讨论】:

【参考方案1】:

Koush/Ion 示例

在 gradle.build 中添加:

    implementation 'com.koushikdutta.ion:ion:3.1.0'
    implementation 'com.google.android.gms:play-services-base:17.5.0'

这是您将在 Activity 类中使​​用的示例(经过测试):

private void post() 
        JsonObject json = new JsonObject();
        // add whatever variables you need
        json.addProperty( "username", "user" );
        json.addProperty( "password", "password" );

        Ion.with( this )
                .load("https://example.com/rest/credentials")
                .setJsonObjectBody( json )
                .asJsonObject()
                .setCallback(new FutureCallback<JsonObject>() 
                    @Override
                    public void onCompleted(Exception e, JsonObject result) 
                        // let's suppose the result looks like this:  "result":  "token": "AFDfz553#FF0015"  
                        String token = result.getAsJsonObject( "result" ).get( "token" ).getAsString();
                        get( token );
                    
                );
    

    private void get( String token ) 
        Ion.with( this )
                .load("https://example.com/rest/api/product")
                .addQuery( "token", token )
                .asJsonObject()
                .setCallback(new FutureCallback<JsonObject>() 
                    @Override
                    public void onCompleted(Exception e, JsonObject result) 
                        // do stuff with the result or error, for example : "prod_title" : "The Tittle", "imageUrl" : "blabla"
                        String title = result.get( "prod_title" ).getAsString();
                        String imgSrc = result.get( "imageUrl" ).getAsString();
                        //etc... or add all values to a List
                        List<String> values = new ArrayList<>();
                        for ( String k : result.keySet() ) 
                            values.add( result.get( k ).getAsString() );
                        
                    
                );
    

Get 方法中的addQuery 部分将令牌作为参数添加到加载的 url。在上面的示例中,网址 https://example.com/rest/api/product 变为 https://example.com/rest/api/product?token=tokenValue

【讨论】:

第二次请求 (GET) 的结果类似于 [ "prod_title" : "The Tittle", "imageUrl" : "blabla...." 等] 您可能希望按名称提取这些值: receivedJson.getString("prod_title");等 你的意思是循环? 基本上我想要实现的是首先使用用户将输入的用户名和密码,然后发出 POST 请求以获取不记名令牌(如果凭据有效),然后使用此不记名令牌发出 GET 请求并获取带有产品信息的 json。知道我是否可以使用我发布的链接来做到这一点,或者你有任何其他指导吗?谢谢。 你绝对可以,我更改了答案以符合你放置的链接。

以上是关于Android 对 API url 的简单 POST 和 GET 请求的主要内容,如果未能解决你的问题,请参考以下文章

PHP实现RESTful风格的API实例

无法使用 Clover POS REST API 添加带有修饰符的单个行项目

Android 11 (API 30) ContentProvider开发及碰到的问题 (Unknown URL content)

Android:OAuth Microsoft 云健康 API 中未返回刷新令牌

在Django服务器和android应用程序之间进行简单API调用的最佳方法?

Android Api 特定 url 默认值