相关疑难解决方法(0)

使用jQuery $ .ajax()时如何使用GET在请求体中发送数据

我正在使用的服务API具有给定的GET方法,该方法要求在请求的主体中发送数据.

正文中所需的数据是由hypen分隔的id列表,可能非常大,因此必须在正文中发送,否则它可能会在浏览器/代理/ web服务器等链中的某处发生.注意我无法控制服务或API,因此请不要提出更改建议.

我正在使用以下jQuery代码但是在fiddler中观察请求/响应我可以看到我发送的"数据"总是被转换并附加到查询字符串,尽管我将"processData"选项设置为false ...

$.ajax({
   url: "htttp://api.com/entity/list($body)",
   type: "GET",
   data: "id1-id2-id3",
   contentType: "text/plain",
   dataType: "json",
   processData: false, // avoid the data being parsed to query string params
   success: onSuccess,
   error: onError
});
Run Code Online (Sandbox Code Playgroud)

任何人都知道如何强制在请求正文中发送"数据"值?任何帮助表示赞赏,提前谢谢.

javascript ajax jquery

53
推荐指数
2
解决办法
11万
查看次数

将JSON序列化为查询字符串的标准化方法?

我正在努力建立一个宁静的API,我正在努力如何将JSON数据序列化为HTTP query string.

需要在请求中传递许多强制和可选参数,例如(在下面表示为JSON对象):

{
   "-columns" : [
      "name",
      "column"
   ],
   "-where" : {
      "-or" : {
         "customer_id" : 1,
         "services" : "schedule"
      }
   },
   "-limit" : 5,
   "return" : "table"
}
Run Code Online (Sandbox Code Playgroud)

我需要支持不同数量的不同客户端,所以我正在寻找一种标准化的方法将这个json对象转换为查询字符串.有一个,它看起来怎么样?

另一种方法是允许用户只是传递消息体中的json对象,但我读到我应该避免它(带请求体的HTTP GET).

有什么想法吗?

编辑以澄清:

列出一些不同的语言如何编码上面给定的json对象:

  • jQueryusing $.param:-columns [] = name&-columns [] = column&-where [-or] [customer_id] = 1&-where [-or] [services] = schedule&-limit = 5&return = column
  • PHPusing http_build_query:-columns [0] = name&-columns [1] = column&-where [-or] [customer_id] …

serialization json http-get query-string

50
推荐指数
4
解决办法
7万
查看次数

这个陈述是否正确?HTTP GET方法始终没有消息体

这个陈述是否正确?HTTP GET方法始终没有消息体.我没有发现RFC2616的任何部分明确说出这一点.

如果不是这样,那么Http GET请求在什么情况下会包含一个消息体

http-headers

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

对于Restful API,GET方法可以使用json数据吗?

我不希望在URI中看到如此长的参数字符串.那么,GET方法可以使用json数据吗?

在我的情况下,我需要过滤给定种类的参数.如果有很多参数,则长度可能超过URI的限制.那么,这个问题是否有最佳实践?

api rest json get

38
推荐指数
2
解决办法
11万
查看次数

使用RestSharp设置'Content-Type'标头

我正在为RSS阅读服务建立一个客户端.我正在使用RestSharp库与他们的API进行交互.

API声明:

创建或更新记录时,必须设置application/json; charset = utf-8作为Content-Type标头.

这就是我的代码:

RestRequest request = new RestRequest("/v2/starred_entries.json", Method.POST);
request.AddHeader("Content-Type", "application/json; charset=utf-8");
request.RequestFormat = DataFormat.Json;
request.AddParameter("starred_entries", id);

//Pass the request to the RestSharp client
Messagebox.Show(rest.ExecuteAsPost(request, "POST").Content);
Run Code Online (Sandbox Code Playgroud)

然而; 服务返回"错误415:请使用'Content-Type:application/json; charset = utf-8'标题." 为什么RestSharp没有传递标题?

c# http-headers restsharp

32
推荐指数
3
解决办法
7万
查看次数

当需要一些复杂的参数时,设计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万
查看次数

基于参数类型重载web api动作方法

有没有办法基于Action方法的重载执行参数类型?即是否可以在控制器中执行以下操作

public class MyController : ApiController
{
   public Foo Get(int id) { //whatever }

   public Foo Get(string id) { //whatever }

   public Foo Get(Guid id)  { //whatever }
}
Run Code Online (Sandbox Code Playgroud)

如果是这样,需要对Route表进行哪些更改.

asp.net-web-api

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

Spring MVC控制器中的JSON参数

我有

@RequestMapping(method = RequestMethod.GET)
@ResponseBody
SessionInfo register(UserProfile profileJson){
  ...
}
Run Code Online (Sandbox Code Playgroud)

我以这种方式传递profileJson:

http://server/url?profileJson={"email": "mymail@gmail.com"}
Run Code Online (Sandbox Code Playgroud)

但我的profileJson对象具有所有空字段.我该怎么办才能让春天解析我的json?

java spring json spring-mvc

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

HTTP GET请求正文RETROFIT

我正在使用Retrofit在我的Android应用程序中进行api调用.我必须提交@Body of JSON

@GET("api/")
void getData(@Body UserPostRequestBody request)
Run Code Online (Sandbox Code Playgroud)

我收到错误消息

retrofit.RetrofitError: apiCall: Non-body HTTP method cannot contain @Body or @TypedOutput.
Run Code Online (Sandbox Code Playgroud)

你知道吗?

java android get retrofit

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

Swagger TypeError:无法在'Window'上执行'fetch':使用GET/HEAD方法的请求不能有正文

我已将Swagger添加到Spring Boot 2应用程序中:

这是我的Swagger配置:

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket api() {
        // @formatter:off
        return new Docket(DocumentationType.SWAGGER_2)  
                .select()                                  
                .apis(RequestHandlerSelectors.any())              
                .paths(PathSelectors.any())                          
                .build();
        // @formatter:on
    }

}
Run Code Online (Sandbox Code Playgroud)

这是Maven依赖:

    <!-- Swagger2 -->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.8.0</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.8.0</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

当我尝试调用例如http:// localhost:8080/api/actuator/auditevents时, 它失败并出现以下错误:

TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body.
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我做错了什么以及如何解决?

swagger swagger-ui spring-boot swagger-2.0

23
推荐指数
5
解决办法
3万
查看次数