相关疑难解决方法(0)

当需要一些复杂的参数时,设计HTTP请求的最佳方法是什么?

我有一些我正在写的Web服务,我想尽可能地保持RESTful.我使用在IIS/ASP.NET/SharePoint中运行的HTTPHandler来托管这些Web服务.

我的大多数服务都期望HTTP GET.我有两个只是返回一些数据(即查询)并将是幂等的,但参数可能有点复杂.它们都可以包括服务参数中的字符,这些字符至少不允许URL的PATH部分.

使用IIS,ASP.NET和SharePoint我发现URL路径中的以下字符甚至没有进入我的HttpHandler,即使Url编码(请求爆炸,我对此没有任何简单的控制) :

  • %(%25)
  • &(%26)
  • *(%2a,但没有Url编码)
  • +(%2b)
  • :(%3a)
  • <(%3c)
  • (%3E)

以下字符使其成为我的HttpHandler,但即使Url编码,UriTemplate也无法正确处理它们:

  • (%23)

  • .(%2e,但没有Url编码; UriTemplate删除了"."如果是/之前的最后一个字符)
  • ?(%3f)的
  • /(%2f - 即使UrlEncoded,UriTemplate也因为显而易见的原因而失败)
  • \(%5c)

所以,我有点彻底,但我需要在查询字符串中测试这些url编码的字符.看起来这在大多数情况下都会起作用.

在我的一个服务中,作为参数的特殊字符在语义上是查询/过滤器的一部分(实际上是搜索服务的搜索项),但在另一个中它们实际上不是查询/过滤器的一部分,所以理想情况下它们是路径而不是查询字符串.

我的问题是,最好的选择是什么?以下是我所知道的一些内容:

  1. 使用HTTP GET和查询字符串. 任何可能使用特殊字符的内容都应该在查询字符串和Url Encoded上. 这是我倾向于的地方,但我担心极长的查询字符串(IE有2083限制)

  2. 在路径中使用HTTP GET和base64编码.对于可能使用特殊字符的任何参数, 请使用Modified Base64 for URL,并将其作为路径的一部分(如果需要). 我试过这个并且它有效,但它有点难看.关于极长查询字符串的问题仍然存在.

  3. 使用HTTP POST和邮件正文. 任何可能使用特殊字符的东西都应该在请求的正文中. 似乎是一个不错的解决方案,但帖子被理解为和(我认为)通常意味着更改(而没有变化发生在这里).

  4. 使用HTTP GET和邮件正文. 任何可能使用特殊字符的东西都应该在请求的正文中.根据SO,这似乎是一个坏主意:请求正文Roy Fielding的HTTP GET.

  5. 根据请求的大小,使用#3和#1或#2的组合.

  6. 其他???

请注意,在某些情况下,我可以更改周围的东西以防止特殊字符(我可能会这样做),但我无法在所有情况下都这样做.


关于URI长度,RFC2616 Sec3.2.1说明如下:

HTTP协议不对URI的长度设置任何先验限制.服务器必须能够处理它们所服务的任何资源的URI,并且如果它们提供可以生成这种URI的基于GET的表单,它应该能够处理无限长度的URI.如果URI长于服务器可以处理的长度,服务器应该返回414(Request-URI Too Long)状态(参见10.4.15节).

  Note: Servers ought to be cautious about depending on …
Run Code Online (Sandbox Code Playgroud)

rest get http uritemplate

31
推荐指数
4
解决办法
3万
查看次数

通过POST请求使用GET请求有什么好处?

我过去的几个ajax应用程序都使用了GET请求,但现在我开始使用POST请求了.POST请求似乎稍微更安全,绝对更友好/漂亮.因此,我想知道为什么我应该使用GET请求.

ajax protocols http http-get http-post

29
推荐指数
6
解决办法
2万
查看次数

Internet Explorer 9可以使用多长时间的URL?

以前版本的Internet Explorer在超过2,083个字符的Web地址上出现错误(请参阅http://support.microsoft.com/kb/208427).同时,Firefox,Opera和Safari可以处理至少80,000个.

版本9带来了许多改进.URL长度是其中之一吗?

url internet-explorer internet-explorer-9

29
推荐指数
2
解决办法
3万
查看次数

如何将JSON数组作为URL中的参数传递

我要求在Web服务调用中将一些值从移动设备传递到服务器,因此我打算以JSON格式传递所有值,如下所示

{
    "nameservice": [
        {
            "id": 7413,
            "name": "ask"
        },
        {
            "id": 7414,
            "name": "josn"
        },
        {
            "id": 7415,
            "name": "john"
        },
        {
            "id": 7418,
            "name": "R&R"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

以下是我的服务电话

@RequestMapping("/saveName")
@ResponseBody
public String saveName(String acc)
{jsonObject = new JSONObject();
    try
    {
    );
    System.out.println(acc);
    jsonObject.accumulate("result", "saved ");
    }
    catch(Exception e)
    {
        e.printStackTrace();jsonObject.accumulate("result", "Error Occured ");
    }
    return jsonObject.toString();
}
Run Code Online (Sandbox Code Playgroud)

我试图通过这种方式调用上述服务

localhost:8080/service/saveName?acc={ "nameservice": [ { "id": 7413, "name": "ask" }, { "id": 7414, "name": "josn" }, { "id": 7415, "name": …
Run Code Online (Sandbox Code Playgroud)

java spring json web-services

27
推荐指数
3
解决办法
15万
查看次数

自定义URL方案最大URL长度

根据标题,在将自定义URL方案与应用程序一起使用时,URL的最大长度是多少?

例如,如果我通过URL启动另一个应用程序,并使用类似的东西传递一个数据blob

   myappscheme://一些/路径数据= 0123456789ABCDEF

在URL被切断之前该字符串可以获得多长时间(或者系统拒绝启动其他应用程序)?

custom-url ios

26
推荐指数
4
解决办法
1万
查看次数

如何防止"确认表单重新提交"对话框?

如何在提交后清除表单中的信息,以便在页面刷新后不显示此错误?

查看图片(来自chrome):

该对话框包含以下文字:

您要查找的页面使用
了您输入的信息.返回该
页面可能会导致您
重复执行任何操作.你想继续吗?

我希望这个对话框不会出现.

javascript php jquery codeigniter

22
推荐指数
5
解决办法
9万
查看次数

为什么Java将方法的大小限制为65535字节?

我刚刚编译了以下代码

public class A {
    public static void main(String... args) {
        int i = 3;
        ++i; 
        ++i;
        ++i;
        ++i;
        ++i;
        ++i;
        ++i;
        ++i;
        // repeat writing the expression ++i for 20,000 times

        System.out.println(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

并收到以下错误消息

方法main(String ...)的代码超过65535字节限制

为什么Java实现此限制?我没有看到理性,因为Java确实包含了goto_w指令.

java

19
推荐指数
1
解决办法
2万
查看次数

Google静态地图网址长度限制

我有153个标记,需要用它们生成一个静态地图,但是当把它们放在网址中时,我得到一个如下错误:

414 Request-Uri Too Large
Run Code Online (Sandbox Code Playgroud)

我的网址是这样的

"http://maps.google.com/maps/api/staticmap?center=13.00,-85.00&size=600x500&maptype=roadmap&markers=13.305,-86.18636&markers=13.72326,-86.13705&......"
Run Code Online (Sandbox Code Playgroud)

谢谢大家!

javascript django google-maps google-maps-api-3 google-maps-static-api

17
推荐指数
4
解决办法
1万
查看次数

在URL和Windows文件名(Java)之间转换?

在Java中,是否有一种在urls和windows文件名之间进行转换的标准/好方法?

我正在尝试下载文件,但我希望Windows文件名可以转换回原始文件名.请注意,网址的查询部分至关重要,因为我将下载仅在查询中有所不同的不同页面.

我目前的hacky解决方案是用特定字符串(例如'QQ')替换非法字符(例如'?'),但这会使转换回url的透明度降低.有没有更好的办法?

java windows url file

16
推荐指数
1
解决办法
1万
查看次数

如何使用REST API实现复杂查询?

我正在使用ember-data构建一个EmberJS应用程序.

我的应用程序中的某些功能需要非常复杂的查询.

举个例子,假设我有三个实体 - 学生,老师和班级.如果我想得到1993年之前出生的所有在X老师上课的学生的名单,我怎么能用RESTful api做到这一点?在简单的SQL中,它很容易,但我不确定在我的API中实现它的最佳实践.

我是否需要与基本的REST API一起构建自定义端点?

所以我仍然有:

GET /students (which returns all the students)
GET /students/{id} (which returns a specific student)
etc
Run Code Online (Sandbox Code Playgroud)

但是为我的"自定义"查询实现以下内容:

GET /students/custom/born_before/{date}/taught_by/{teacher_id}
Run Code Online (Sandbox Code Playgroud)

或者有更标准化的方法吗?

api rest ember-data

14
推荐指数
2
解决办法
9756
查看次数