jjzjj

android - 带 Volley 的 HTTP 发布 --- XML 发布,JSON 响应

coder 2024-07-01 原文

我正在尝试进行 API 调用,并且 API 需要格式为 XML:

 <root>
<subject>Security</subject>
<request>GetSessionInfo</request>
<sessionGUID>999999999999</sessionGUID>
<userGUID></userGUID>
<emptyString/>
<lastUpdateDate>
<forceLoad>0</forceLoad>
<transporterFormat>2</transporterFormat>
<parms>            {
                            "sessionGUID":"99999999999999"
            }
            </parms>
</root>

但它以 JSON 格式向我发送输出。我一直在尝试使用 Volley 来完成此操作:

        RequestQueue mRequestQueue = RequestQueueSingleton
           .getInstance(this.getApplicationContext())
           .getRequestQueue();

        String targetURL = "http://api.myurl.com";

        StringRequest postRequest = new StringRequest(Request.Method.POST, targetURL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        userGUID = response;


                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> parms = new HashMap< >();
                JSONObject jsonRequest = new JSONObject();
                try {
                    jsonRequest.put("sessionGUID", sessionGUID);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                parms.put("requestData",
                        getXML(SECURITY, GET_SESSION_INFO, "", sessionGUID, "", null, jsonRequest));
                return parms;
            }
        };
        postRequest.setTag("POST");
        System.out.println("we've attempted to use Volley");
        mRequestQueue.add(postRequest);


With the reference GetXML methods as follows: 

     public String getXML(String subject, String request, String userGUID, String sessionGUID,, Date lastUpdateDate, JSONObject parms) {
        StringBuilder stringBuilder = new StringBuilder();
        String date;
        if (lastUpdateDate == null) date = "";
        else date = lastUpdateDate.toString();
        stringBuilder.append("<root>\n <subject>" + subject + "</subject>\n")
        .append("<request>" + request + "</request>\n ")
                .append("<sessionGUID>" + sessionGUID + "</sessionGUID>\n")
                .append("<userGUID>" + userGUID + "</userGUID>\n")
                .append("<emptyString>" + "" + "</emptyString>\n ")
                .append("<lastUpdateDate>" + date + "</lastUpdateDate>\n ")
                .append("<forceLoad>0</forceLoad>\n" + " <transporterFormat>2</transporterFormat>\n")
                .append("<parms>" + parms.toString() + "</parms>\n" + "</root>");

        String result = stringBuilder.toString();
        System.out.println(result);
        return result;
    }

我不确定我对 Volley 的使用是否存在问题,或者该库是否完全不支持我正在尝试的操作。我想我可能需要实现一个自定义请求类型,它发送一个 XML 字符串并返回一个 JSON 对象,但是相对缺乏文档让我不确定如何去做.任何帮助将不胜感激,抱歉太长了!

最佳答案

在 volley 中有一种方法可以发送自定义正文。这是通过覆盖 getBody() 来完成的。您不需要覆盖 getParams()。而是用以下代码 fragment 替换您的 getParams() 函数。

 @Override
    public byte[] getBody() throws AuthFailureError {
               JSONObject jsonRequest = new JSONObject();
                try {
                    jsonRequest.put("sessionGUID", sessionGUID);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
        String body = getXML(SECURITY, GET_SESSION_INFO, "", sessionGUID, "",  null, jsonRequest));
        return body.getBytes();
    }

关于android - 带 Volley 的 HTTP 发布 --- XML 发布,JSON 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37753288/

有关android - 带 Volley 的 HTTP 发布 --- XML 发布,JSON 响应的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  3. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  4. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  5. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  6. ruby-on-rails - 如何使用 Rack 接收 JSON 对象 - 2

    我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":

  7. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  8. ruby-on-rails - 如何在发布新的 Ruby 或 Rails 版本时收到通知? - 2

    有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:

  9. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  10. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

随机推荐