在 Android 的 RESTFUL Web 服务的 URL 中传递 JSON 对象?

Posted

技术标签:

【中文标题】在 Android 的 RESTFUL Web 服务的 URL 中传递 JSON 对象?【英文标题】:passing JSON object in URL of RESTFUL Web service in Android? 【发布时间】:2013-10-10 13:05:56 【问题描述】:

我正在使用 JSON Restful Web 服务,我必须在服务 URL 中传递 JSON 对象。我已成功创建 JSON 对象,但当我的 URL 创建与 SERVER 的 HTTP 连接时出现异常。

下面我提到了我的网址:

 http://72.5.167.50:8084/UpdateProfileInfo?"ProfileEditId":"917","ContactsEmail":["Email":"dsfs","ContactId":""],"ContactsPhone":["CountryId":"+1","Type":"2","Phone":"345345"],"ProfileId":"290","LastName":"demo","GroupId":"1212","Title":"sdf","City":"dsf","TemplateId":"1212","State":"dsf","AuthCode":"9bcc6f63-2050-4c5b-ba44-b8103fbc377a","Address":"sdf","FirstName":"demo","ContactId":"","Zip":"23","Company":"tv"

在代码中获取java.lang.IllegalArgumentException: Illegal character in query

int TIMEOUT_MILLISEC = 100000; // 1000 milisec = 1 seconds
int SOCKET_TIMEOUT_MILISEC = 120000; // 2 minutes
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT_MILLISEC);
HttpConnectionParams.setSoTimeout(httpParams, SOCKET_TIMEOUT_MILISEC);
HttpClient client = new DefaultHttpClient(httpParams);
HttpPost request = new HttpPost(url);
HttpResponse response = client.execute(request);
responseString = request(response);

如果我的网址有问题,请建议我。

*已编辑:*尝试使用密钥仍然得到异常:

http://72.5.167.50:8084/UpdateProfileInfo?profileinof="ProfileEditId":"917","ContactsEmail":["Email":"sdf","ContactId":""],"ContactsPhone":["CountryId":"+1","Type":"2","Phone":"345345345"],"ProfileId":"290","LastName":"demo","GroupId":"1212","Title":"dsf","City":"dsf","TemplateId":"1212","State":"dsf","AuthCode":"d968273a-0110-461b-8ecf-3f9c456d17ac","Address":"dsf","FirstName":"demo","ContactId":"","Zip":"23","Company":"tv"

【问题讨论】:

【参考方案1】:

我们需要为这种请求发出不同格式的 HTTP 请求。

我在下面提到了我的代码。

public JSONObject getJSONObject()


    return jsonObj;
    

ABove 方法返回一个 JSON 字符串,它在下面的方法中传递。

public static HttpResponse makeRequest(String url) throws Exception 

    //instantiates httpclient to make request
    DefaultHttpClient httpclient = new DefaultHttpClient();

    //url with the post data
    HttpPost httpost = new HttpPost(url);

    //convert parameters into JSON object
    JSONObject holder = getJSONObject();
    //passes the results to a string builder/entity
    StringEntity se = new StringEntity(holder.toString());
    //sets the post request as the resulting string
    httpost.setEntity(se);
    httpost.setHeader("Accept", "application/json");
    httpost.setHeader("Content-type", "application/json");

    //Handles what is returned from the page 
    ResponseHandler responseHandler = new BasicResponseHandler();
    return httpclient.execute(httpost, responseHandler);

堆栈帖子帮助我完成了这项任务......!!!

【讨论】:

【参考方案2】:

IP 不正确。

IP 由 4 个字节组成。每个字节是一个从 0 到 255 的值,不能是 7000。

http://7232.25.1617.50:1084

编辑:好的,您编辑了您的问题。您正在发送 JSON 作为参数。但是这个参数没有“key”。

应该是:

/UpdateProfileInfo?info="ProfileEditId":"917",[.......]

编辑:我认为应该是这样的:

/UpdateProfileInfo?info="'ProfileEditId':'917',[.......]"

注意该值被"包围,内部"现在被'替换

【讨论】:

@Sam-In-TechValens 我已经编辑了我的答案。再次检查。无论如何你应该使用yanchenko提供的答案,因为get参数有字符限制,而POST没有。【参考方案3】:

问题可能是您尝试将 JSON 对象作为 url 参数发布。 如果它真的必须是一个 url 参数,它必须是 urlencoded。 如果它应该是一个普通的 POST 请求,我建议使用high level helper:

new RESTClient2(ctx).post("http://72.5.167.50:8084", jsonObject);

【讨论】:

【参考方案4】:

我可以看到需要使用 POJO,将它们转换为 JSON 字符串并通过 HTTP 传送该字符串信息。有很多好的 android/java/apache/volley 类型库允许这样做。

但是,我不明白,实际上我不同意您使用 GET 和 URL 参数来传输 JSON 字符串的要求?

执行以下操作真的很容易:

POJO -> 到 JSON -> toString -> 到 http.string.entity -> POST

为什么不重新检查您的架构并考虑使用 POST 而不是 GET。

然后很简单,两步:

见example"request.setEntity(..."

您的代码将如下所示:

httpPost.setEntity(new StringEntity(pojo.toJSON().toString()));

【讨论】:

是的......这就是我所做的......已经回答了......谢谢:)

以上是关于在 Android 的 RESTFUL Web 服务的 URL 中传递 JSON 对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 android 调用 RESTful Web 服务?

在 Android 的 RESTFUL Web 服务的 URL 中传递 JSON 对象?

[Go] Golang练习项目-web客服系统即时通讯websocket项目go-fly

Web App (angular)、iOS 和 Android 可以使用的安全 RESTful API

从 Android 向 .net Restful WebService 发送参数

在GlassFish应用服务器上创建并运行你的第一个Restful Web Service翻译