从Java到西纳特拉服务发布JSON PARAMS(Posting JSON params from

2019-07-31 07:13发布

我有一个Android应用程序发布到我的西纳特拉服务。 早些时候,我没能在我屈服务中读取参数。 然而,当我设置的内容类型为“X WWW的形式,进行了urlencoded”。 我能看到PARAMS但倒不怎么我想要的。 我得到我的末日服务的东西这是我的请求的PARAMS。

{"{\"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;
}

我试图使用给出的方法: 如何使Java中的嵌套的JSON对象?

这是我使用的链接中提到的方法做了我的请求。

public ArrayList<NameValuePair> getJsonObjectfromNameValueList(ArrayList<NameValuePair> _params, String RootName){
    ArrayList<NameValuePair> arrayList = new ArrayList<NameValuePair>();
    JSONObject jsonObject = new JSONObject();
    if (_params != null) {
        if (!_params.isEmpty()) {
            for (NameValuePair p : _params) {
                try {
                    if (p.getName().equals(ApplicationFacade.SESSION_ID))
                        arrayList.add(new BasicNameValuePair((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.
                }
            }
        }
    }
    arrayList.add(new BasicNameValuePair(RootName, jsonObject.toString()));
    return arrayList;
}

响应我做出​​上述改变是在此之后有:

{"session_id"=>"958c7dee-f12c-49ec-ab0c-932e9a4ed173",
"user"=>"[gender=male]",
 "splat"=>["update_profile.json"],
 "captures"=>["update_profile.json"]}

相当接近,但“性别=男”是不可取的。 我需要将这些参数盲目传递到另一个服务,所以我需要让他们的权利。

我想在我屈服务PARAMS跟随。

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

}

Answer 1:

事实证明,这个问题是与西纳特拉获取其PARAMS的方式。 我能解决使用凯尔的这个帖子真棒回应我的问题: 西纳特拉控制器PARAMS方法在空未来的JSON POST请求

码:

before do
  if request.request_method == "POST" and request.content_type=="application/json"
    body_parameters = request.body.read
    parsed = body_parameters && body_parameters.length >= 2 ? JSON.parse(body_parameters) : nil
    params.merge!(parsed)
  end
end

替代方法 :不过,我发现了一个更好的解决办法来对付它,加入中间件为我做同样的。 我用rack-contrib宝石。 以下是我在我的代码做了修改:

编辑

使用git获得其中的问题涉及到的内容类型版本application/json;charset=UTF-8是固定

的Gemfile:

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

config.ru:

use Rack::PostBodyContentTypeParser

来源: http://jaywiggins.com/2010/03/using-rack-middleware-to-parse-json/



Answer 2:

使用下面的工作对我来说要好得多。 我不得不添加request.body.rewind和:symbolize_names =>真(同时呼吁JSON.parse)

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


文章来源: Posting JSON params from java to sinatra service