从 JAVA Spring 创建对 Firebase 的 HTTP.PATCH 请求

Posted

技术标签:

【中文标题】从 JAVA Spring 创建对 Firebase 的 HTTP.PATCH 请求【英文标题】:Create HTTP.PATCH request to firebase from JAVA Spring 【发布时间】:2014-04-10 18:00:51 【问题描述】:

问题是JavaHTTPUrlConnection不支持HTTP.PATCH。

所以我找到了一个使用正文执行删除的指南。但我收到了HTTP/1.1 400 Bad Request

我到达了这个: * 导入 compile("org.apache.httpcomponents:httpclient:4.3.1")

方法:

@SneakyThrows
    public void firebasePatch(final PARAM p) 
        new TaskRunner() 

            @Override
            public void command() throws Throwable 
                final HttpClient httpClient = new DefaultHttpClient();
                HttpConnectionParams.setConnectionTimeout(httpClient.getParams(), 10000);
                PARAM p2 = p;
                String callUrl = url+".json"+"?auth="+firebaseAuth;
                HttpPatch httpPatch = new HttpPatch(callUrl);
                httpPatch.addHeader("Accept", "*/*");
                httpPatch.addHeader("Content-Type", "application/json");
//              httpPatch.addHeader("auth", firebaseAuth);

                String patchString = "'userwallposts': 'ame_lector_dk': ['wallPostUrl': '/wallposts/1','createdByLink': '',"+
                            "'summary': 'blah gik sig ikke en tur, og købte blah med hjem','createdDate': '20140126220550','comments': '2',"+
                            "'title': '1Blah blah blah','createdBy': 'PATCHED!','picture': 'http://images6.alphacoders.com/316/316963.jpg']";
                StringEntity entity = new StringEntity(patchString, "UTF-8");
                entity.setContentType("application/json");
                httpPatch.setEntity(entity);
                HttpResponse response = httpClient.execute(httpPatch);
                int statusCode = response.getStatusLine().getStatusCode();
                if (statusCode == 200 ? true : false) 
                    // ok
                    System.out.println("patch complete");
                 else 
                    System.out.println(response.getStatusLine());
                

            
        .run(nonBlock, exceptionHandling);

    

我检查了 Url+方法在 Advanced Rest 客户端中是否有效,无法弄清楚为什么我的 Spring boot 项目没有得到相同的输出,任何帮助将不胜感激。

【问题讨论】:

您能简单地使用 Java SDK for Firebase 吗?如果是这样,可能会让事情变得更简单。 另外,好像有个HttpPatch:hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/… 到底是什么问题?是什么不起作用,有什么症状? @Kato 因为他们的“JAVA SDK”实际上是一个“android SDK”,这意味着它不能在非安卓设备上运行。是的,还有一个 HttpPatch,我也在上面的代码 sn-p 中使用它? 我想您可能需要询问 Firebase 人员 400 是什么意思。如果您使用 Spring 来使用 RestTemplate 而不是原始的 HttpClient,您可能会发现它更容易,但这并不能解释错误的请求。 【参考方案1】:

补丁声明没有错。只是我的 JSON 不正确。 感谢@DaveSyer 让我的狭隘视野(专注于方法,补丁红色。)扩展。

Firebase 写道:

错误情况

Firebase REST API 在这些情况下会返回错误代码。

通过 HTTP 而不是 HTTPS 发出的请求将导致 HTTP 状态码 404 Not Found

无法解析 PUT 或 POST 数据将导致 HTTP 状态代码 400 Bad Request

缺少 PUT 或 POST 数据将导致 HTTP 状态代码 400 Bad Request

尝试 PUT 或 POST 太大的数据会导致 HTTP 状态代码 400 Bad Request

未指定命名空间的 REST API 调用将导致 HTTP 状态代码 417 Expectation Failed

在 path400 错误请求中包含无效子名称的 REST API 调用

违反安全规则的请求将导致 HTTP 状态代码 403 Forbidden

【讨论】:

以上是关于从 JAVA Spring 创建对 Firebase 的 HTTP.PATCH 请求的主要内容,如果未能解决你的问题,请参考以下文章

spring学习

走进Spring——Spring框架概述

Spring IOC容器

Spring 从入门到精通系列 04——Spring 对 bean 的管理细节

Spring IOC核心功能快速入门

spring--IoC容器