Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将JSON参数从java发布到sinatra服务_Java_Android_Json_Sinatra - Fatal编程技术网

将JSON参数从java发布到sinatra服务

将JSON参数从java发布到sinatra服务,java,android,json,sinatra,Java,Android,Json,Sinatra,我有一个android应用程序发布到我的sinatra服务。早些时候,我无法读取sinatra服务上的参数。但是,在我将内容类型设置为“x-www-form-urlencoded”之后。我能看到params,但不完全是我想要的。我在sinatra服务中心收到了一些我的请求 {"{\"user\":{\"gender\":\"female\"},\"session_id\":\"7a13fd20-9ad9-45c2-b308- 8f390b4747f8\"}"=> nil, "splat"=

我有一个android应用程序发布到我的sinatra服务。早些时候,我无法读取sinatra服务上的参数。但是,在我将内容类型设置为“x-www-form-urlencoded”之后。我能看到params,但不完全是我想要的。我在sinatra服务中心收到了一些我的请求

{"{\"user\":{\"gender\":\"female\"},\"session_id\":\"7a13fd20-9ad9-45c2-b308-
8f390b4747f8\"}"=> nil, "splat"=>["update_profile.json"], "captures"=>["update_profile.json"]}
这就是我从我的应用程序发出请求的方式

StringEntity se;                    
se = new StringEntity(getJsonObjectfromNameValueList(params.get_params(), "user");
se.setContentType("application/x-www-form-urlencoded");
postRequest.setEntity(se);



private JSONObject getJsonObjectfromNameValueList(ArrayList<NameValuePair> _params, String RootName) {
    JSONObject rootjsonObject = new JSONObject();
    JSONObject jsonObject = new JSONObject();

    if (_params != null) {
        if (!_params.isEmpty()) {
            for (NameValuePair p : _params) {
                try {
                    if (p.getName().equals(ApplicationFacade.SESSION_ID))
                        rootjsonObject.put((String) p.getName(), (String) p.getValue());
                    else
                        jsonObject.put((String) p.getName(), (String) p.getValue());
                } catch (JSONException e) {
                    e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
            }
        }
    }

    try {
        rootjsonObject.put(RootName, jsonObject);

    } catch (JSONException e) {
        e.printStackTrace();
    }
    return rootjsonObject;
}
非常接近,但“性别=男性”是不可取的。我需要盲目地将这些参数传递给另一个服务,所以我需要正确地处理它们

我在sinatra服务中需要的参数如下

{"session_id" : "958c7dee-f12c-49ec-ab0c-932e9a4ed173",
 "user": 
 {
   "gender" : "male"
 }

}

事实证明,问题在于Sinatra获取参数的方式。 我能够用凯尔对这篇文章的精彩回复来解决我的问题:

代码:

替代方法: 然而,我找到了一个更好的解决方案,通过添加一个中间件来为我做同样的事情。我使用了
rack contrib
gem。 以下是我在代码中所做的更改:

编辑

使用git获取与内容类型
application/json相关的问题所在的版本;字符集=UTF-8
是固定的

Gemfile:

gem 'rack-contrib', git: 'git@github.com:rack/rack-contrib', ref: 'b7237381e412852435d87100a37add67b2cfbb63'
config.ru

use Rack::PostBodyContentTypeParser

来源:

事实证明,问题在于Sinatra获取参数的方式。 我能够用凯尔对这篇文章的精彩回复来解决我的问题:

代码:

替代方法: 然而,我找到了一个更好的解决方案,通过添加一个中间件来为我做同样的事情。我使用了
rack contrib
gem。 以下是我在代码中所做的更改:

编辑

使用git获取与内容类型
application/json相关的问题所在的版本;字符集=UTF-8
是固定的

Gemfile:

gem 'rack-contrib', git: 'git@github.com:rack/rack-contrib', ref: 'b7237381e412852435d87100a37add67b2cfbb63'
config.ru

use Rack::PostBodyContentTypeParser

资料来源:

使用以下方法对我来说效果更好。我必须添加request.body.rewind和:symbol_names=>true(在调用JSON.parse时)


使用以下方法对我更有效。我必须添加request.body.rewind和:symbol_names=>true(在调用JSON.parse时)


您可以尝试将application/json作为ContentType吗?我已经尝试过了。在我的sinatra服务中看不到params。虽然我可以使用-request.body.read阅读它们,但这似乎是一个解决方法。我不理解解释,问题是什么?你用了很多“this”这个词,但我不知道你指的是什么。我做了一些语言上的改变。希望它能帮助您尝试将application/json作为ContentType吗?我已经尝试过了。在我的sinatra服务中看不到params。虽然我可以使用-request.body.read阅读它们,但这似乎是一个解决方法。我不理解解释,问题是什么?你用了很多“this”这个词,但我不知道你指的是什么。我做了一些语言上的改变。希望能有帮助
use Rack::PostBodyContentTypeParser
before do
  if request.request_method == "POST" and (request.content_type || '').include? "application/json" 
    request.body.rewind
    body_parameters = request.body.read
    parsed = body_parameters && body_parameters.length >= 2 ? JSON.parse(body_parameters, :symbolize_names => true) : nil
    params.merge!(parsed)
  end
end