【问题标题】:How to send HTTP body plain text for GET method?如何为 GET 方法发送 HTTP 正文纯文本?
【发布时间】:2019-10-02 13:10:18
【问题描述】:

我遇到了一个问题,我使用 iGDB REST API 需要通过 GET 方法为某些端点发送一些纯文本

PostMan 没有问题(通过选择“Body”>“raw”并粘贴我的查询),但是当我尝试使用 Objective-C 时,出现一个错误,告诉我“ GET 方法不能有主体"...

这是我的应用中使用的代码

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"MY_URL"]];
[request addValue:@"text/plain" forHTTPHeaderField:@"Content-Type"];
[request setHTTPMethod:@"GET"];
[request setHTTPBody:[@"sort popularity desc;" dataUsingEncoding:NSUTF8StringEncoding]];

编辑 02/10/2019

尝试在标题中添加每个过滤器不起作用...

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"MY_URL"]];
[request setValue:[[@"id,name,first_release_date,release_dates,cover,platforms" dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0] forHTTPHeaderField:@"fields"];
[request setValue:[[@"popularity desc" dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0] forHTTPHeaderField:@"sort"];
[request setValue:[[@"5" dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0] forHTTPHeaderField:@"limit"];
[request setValue:[[@"0" dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0] forHTTPHeaderField:@"offset"];

提前感谢您的任何回复!

【问题讨论】:

  • 很想知道你是如何解决这个问题的,因为我正在处理同样的问题。

标签: ios objective-c xcode nsurlrequest


【解决方案1】:

根据iOS 13 release notes,GET 请求不再允许有正文:

所有使用 GET HTTP 方法且包含正文的 URLSessionTask 实例现在都会产生错误 NSURLErrorDataLengthExceedsMaximum。 (46025234)

这使得URLSession 更符合HTTP/1.1 RFC

消息正文不得包含在 请求方法的规范(第 5.1.1 节) 不允许在请求中发送实体主体。

【讨论】:

    【解决方案2】:

    如果我得到你的问题,你可以设置参数到你的请求头当你可以设置如下。

      [request addValue:@"valueForKey1" forHTTPHeaderField:@"key1"];
    
      [request addValue:@"valueForKey2" forHTTPHeaderField:@"key2"];
    

    如果你发送的数据格式是这样,

    NSString *stringValueOfParameters =[NSString stringWithFormat:@"userName:blabla"];
    NSData *convertedDat=[stringValueOfParameters dataUsingEncoding:NSUTF8StringEncoding];
    NSString *headerValue=[NSString stringWithFormat:@"Basic %@",[convertedDat base64EncodedStringWithOptions:0]];
    
    [request setValue:headerValue forHTTPHeaderField:@"headerKey"];
    

    // 编辑

    你必须尝试这样,直接写一个Dictionary或者像下面写你的JSON参数为NSString然后转换成Data

    NSDictionary *dictParams = @{ @"fields" : @[@"id",@"name",@"first_release_date",@"release_dates",@"cover",@"platforms"], @"sort" : @"popularity desc", @"limit": @5, @"offset":@0 };
    

    //这是取自一个例子

    NSString *jsonString = @"{\"ID\":{\"Content\":268,\"type\":\"text\"},\"ContractTemplateID\":{\"Content\":65,\"type\":\"text\"}}";
    NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
    

    然后尝试设置标题。

    【讨论】:

    • 感谢您的回复!但它似乎不起作用......我的完整有效负载是“字段 id,name,first_release_date,release_dates,cover,platforms;排序流行度 desc;限制 10;偏移量 0;”但是当我尝试为每个添加参数时,响应数据不受影响......
    • 嘿@iStornZ 你能看看我更新的答案吗,尝试将所有参数编码为字符串,然后将其转换为字符串编码数据格式。
    • 谢谢@elia,但它也不起作用,请检查我编辑的帖子,看看我是否正确:)。
    猜你喜欢
    • 1970-01-01
    • 2019-08-15
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 2021-02-16
    • 2019-08-29
    相关资源
    最近更新 更多