匿名上传文件对象到 Imgur API (JSON) 会导致身份验证错误 401

Posted

技术标签:

【中文标题】匿名上传文件对象到 Imgur API (JSON) 会导致身份验证错误 401【英文标题】:Anonymous Uploading File object to Imgur API (JSON) gives Authentication Error 401 【发布时间】:2013-05-14 09:57:55 【问题描述】:

我创建了一个类 UploadToImgurTask 作为 AsyncTask,它采用单个文件路径参数,创建并设置 MultiPartEntity,然后使用 Apache HttpClient 上传带有所述实体的图像。来自 Imgur 的 JSON 响应保存在 JSONObject 中,我将其内容显示在 LogCat 中以供自己理解。

这是我从 Imgur 收到的 JSON 的屏幕截图:

我在 api.imgur.com 上查找错误状态 401,它说我需要使用 OAuth 进行身份验证尽管 Imgur 已经非常清楚地表明应用程序不需要使用 OAuth 如果图片正在匿名上传(这就是我现在正在做的事情)。

class UploadToImgurTask extends AsyncTask<String, Void, Boolean> 
    String upload_to;

    @Override
    protected Boolean doInBackground(String... params) 
        final String upload_to = "https://api.imgur.com/3/upload.json";
        final String API_key = "API_KEY";
        final String TAG = "Awais";

        HttpClient httpClient = new DefaultHttpClient();
        HttpContext localContext = new BasicHttpContext();
        HttpPost httpPost = new HttpPost(upload_to);

        try 
            final MultipartEntity entity = new MultipartEntity(
                    HttpMultipartMode.BROWSER_COMPATIBLE);

            entity.addPart("image", new FileBody(new File(params[0])));
            entity.addPart("key", new StringBody(API_key));

            httpPost.setEntity(entity);

            final HttpResponse response = httpClient.execute(httpPost,
                    localContext);

            final String response_string = EntityUtils.toString(response
                    .getEntity());

            final JSONObject json = new JSONObject(response_string);

            Log.d("JSON", json.toString()); //for my own understanding 

            return true;
         catch (Exception e) 
            e.printStackTrace();
        
        return false;
    


doInBackground 将上传图像的链接返回给 onPostExecute 后,我想将其复制到系统剪贴板,但 Eclipse 一直说我的 ASyncTask 类中没有定义 getSystemService(String)。

没有合法的方式将链接(字符串)返回到主线程,所以我必须在 UploadToImgurTask(扩展 ASyncTask)中的 onPostExecute 中做任何我必须做的事情

    @Override
protected void onPostExecute(String result) 
    super.onPostExecute(result);
    ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
    ClipData clip = ClipData.newPlainText("label", "Text to copy");
    clipboard.setPrimaryClip(clip);

导致问题的原因是什么?

【问题讨论】:

【参考方案1】:

来自 api.imgur.com 文档,重点是我的:

API 要求每个客户端都使用 OAuth 2 身份验证。这意味着 您必须注册您的应用程序,并生成一个 access_code 如果您想以用户身份登录。

对于公开的只读和匿名资源,例如获取图片信息、查找用户 cmets 等,您只需发送一个 您的请求中带有您的 client_id 的授权标头。这也是 如果您想匿名上传图片(没有图片 绑定到一个帐户),或者如果您想创建一个匿名 专辑。这让我们知道哪个应用程序正在访问 API。

授权:客户端 ID YOUR_CLIENT_ID

很明显,您需要在请求中添加授权标头才能使其正常工作。使用 Apache HttpClient 就这么简单:

httpPost.setHeader("Authorization", yourClientId);

【讨论】:

非常感谢!有效!请注意,确切的代码是 httpPost.setHeader("Authorization", "Client-ID "+ API_key);基于 Imgur 的 API 文档。 对于所有 JS'ian:xhr.setRequestHeader('Authorization', `Client-ID $API_key`) 是等价的。 @我进一步询问;)

以上是关于匿名上传文件对象到 Imgur API (JSON) 会导致身份验证错误 401的主要内容,如果未能解决你的问题,请参考以下文章

使用 Imgur API 上传图像时数据无效

如何从 GraphQL API 调用中获取 JSON 对象元素? [关闭]

使用 Forge API 将文件上传到 BIM 360 的问题

如何使用 Swift 和 Alamofire 成功将视频文件上传到 imgur?

Angular 11如何解析文件上传到javascript对象

我如何访问位于JSON对象内部的嵌套字典内的值?