如何为 GET 方法发送 HTTP body 纯文本?

How to send HTTP body plain text for GET method?

我遇到了问题,我使用 iGDB REST API,它需要为某些具有 GET 的端点发送一些 纯文本 方法。

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

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

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]];

编辑 2019 年 2 月 10 日

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

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"];

提前感谢您的任何回复!

如果我回答你的问题,你可以为你的请求设置参数header你可以像下面这样设置。

  [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];

然后尝试设置header。

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

All URLSessionTask instances with a GET HTTP method that contain a body now produce the error NSURLErrorDataLengthExceedsMaximum. (46025234)

这使得 URLSession 更符合 HTTP/1.1 RFC:

A message-body MUST NOT be included in a request if the specification of the request method (section 5.1.1) does not allow sending an entity-body in requests.